news 2026/5/3 1:46:21

Vue3底层架构——编译器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3底层架构——编译器

编译器是什么意思呢?和我们之前讲过的响应式系统有什么关联呢?

编译器只会生成“访问响应式数据的代码”,执行收集依赖在运行时。

编译 .vue 文件 -> render -> 访问 _ctx.count -> proxy.set -> track

而本文我们着重讲讲编译这个过程。

一、Vue 编译器整体架构

Vue3 把编译器拆分为三个部分:

@vue/compiler-sfc → 处理 .vue 文件 @vue/compiler-dom → DOM 平台相关编译 @vue/compiler-core → 核心编译逻辑(平台无关)

90% 的“原理”,都在 compiler-core

核心目标是把 template 转成“尽量少 diff 的 render 函数”

最终产物不是字符串,而是:

二、编译流水线

Vue 编译是一个​标准三段式编译器​:

学过 babel 的同学可以发现,这个过程非常像 babel 。

Template ↓ parse Template AST ↓ transform JavaScript AST(增强) ↓ generate render function

源码入口(compiler-core):

baseCompile(template, options)

三、第一阶段:parse(模板 → AST)

3.1 AST 节点结构

interface Node { type: NodeTypes loc }

常见节点类型:

enum NodeTypes { ROOT, ELEMENT, TEXT, INTERPOLATION, SIMPLE_EXPRESSION, ATTRIBUTE, DIRECTIVE }

3.2 parse 的本质

依次遍历解析每一个节点,把 template 字符串解析成一棵 AST

示例:

<div>{{ count }}</div>

生成 AST(简化):

ROOT └─ ELEMENT(div) └─ INTERPOLATION └─ SIMPLE_EXPRESSION(count)

四、第二阶段:transform(AST → 优化 AST)

transform 阶段做的不是“改结构”,而是:给 AST 打“运行时优化标记”

4.1 transform 的执行模型

function transform(root, options) { traverseNode(root, context) }

遍历 AST,对每个节点:

  • 执行nodeTransforms
  • 收集依赖
  • 标记 PatchFlag
  • 构建 BlockTree

4.2 transformContext

interface TransformContext { helpers components directives currentNode parent }

transform 不是“纯函数”,而是有上下文的编译过程

4.3 表达式分析

{{ count }}

会被转成:

toDisplayString(_ctx.count)

并且:

  • 标记该节点依赖响应式数据
  • 未来会生成 PatchFlag

4.4 PatchFlag 的来源

PatchFlag 是在 transform 阶段生成的:

PatchFlags.TEXT PatchFlags.CLASS PatchFlags.PROPS PatchFlags.STYLE

例如:

<div>{{ count }}</div>

最终标记:

1 /* TEXT */

该魔法注释表示:这个节点只需要 diff 文本

4.5 Block Tree

openBlock() createElementBlock(...)

Block 的作用:收集所有“动态子节点”

transform 阶段会判断:

  • 哪些节点是静态的
  • 哪些是动态的

动态的才进入 block:

block.children.push(node)

diff 时只遍历 block,不全树 diff

五、第三阶段:generate(AST → render 函数)

5.1 generate 的目标

输出一个 JS 函数 AST,最后 stringify:

function render(_ctx, _cache) { return ... }

5.2 helper 的注入机制

transform 阶段收集:

context.helpers.add(CREATE_ELEMENT_VNODE)

generate 时生成:

import { createElementVNode } from "vue"

5.3 生成代码示例

<div class="a">{{ count }}</div>

生成 render:

function render(_ctx, _cache) { return openBlock(), createElementBlock( "div", { class: "a" }, toDisplayString(_ctx.count), 1 ) }

六、compiler-sfc:.vue 文件是怎么来的?

<template /> <script setup /> <style scoped />

compiler-sfc 做的事:

  • 拆块
  • script setup → 普通 setup
  • CSS scopeId 注入
  • template 交给 compiler-dom

七、为什么 template 性能比 JSX 更稳定?

一句话总结:JSX 直接写 render 函数,绕过了 compiler(绕过了 PatchFlag、BlockTree、精准 diff)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 0:52:55

AI驱动的内容生成:3步搭建Gemma2与云函数融合的智能创作系统

AI驱动的内容生成&#xff1a;3步搭建Gemma2与云函数融合的智能创作系统 【免费下载链接】python-docs-samples Code samples used on cloud.google.com 项目地址: https://gitcode.com/GitHub_Trending/py/python-docs-samples 还在为内容创作的高门槛而头疼&#xff1…

作者头像 李华
网站建设 2026/4/22 3:14:34

标点符号也重要!GLM-TTS语调控制秘诀

标点符号也重要&#xff01;GLM-TTS语调控制秘诀 你有没有遇到过这种情况&#xff1a;明明输入的文本内容没问题&#xff0c;但生成的语音听起来却“怪怪的”——该停顿的地方没停&#xff0c;该强调的地方平平淡淡&#xff1f;其实&#xff0c;问题可能不在模型&#xff0c;而…

作者头像 李华
网站建设 2026/4/24 22:09:40

MidScene.js 零代码自动化:让AI成为你的浏览器操作助手

MidScene.js 零代码自动化&#xff1a;让AI成为你的浏览器操作助手 【免费下载链接】midscene Let AI be your browser operator. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene MidScene.js 是一款革命性的AI驱动浏览器自动化工具&#xff0c;它彻底改变…

作者头像 李华
网站建设 2026/5/1 10:53:48

LLM4Decompile终极指南:掌握AI反编译核心技术全流程

LLM4Decompile终极指南&#xff1a;掌握AI反编译核心技术全流程 【免费下载链接】LLM4Decompile LLM4Decompile是前端技术的革新之作&#xff0c;面向软件逆向工程领域的革命性工具。此开源项目利用大型语言模型深入二进制世界的奥秘&#xff0c;将复杂的机器码魔法般地转换回清…

作者头像 李华
网站建设 2026/5/1 1:42:10

Hikari-LLVM15代码混淆技术深度解析与实战指南

Hikari-LLVM15代码混淆技术深度解析与实战指南 【免费下载链接】Hikari-LLVM15 项目地址: https://gitcode.com/GitHub_Trending/hi/Hikari-LLVM15 Hikari-LLVM15作为HikariObfuscator的重要分支项目&#xff0c;为iOS/macOS开发者提供了全面的代码保护解决方案。该项目…

作者头像 李华
网站建设 2026/4/30 8:22:22

Magisk终极指南:Android设备的完整Root解决方案

Magisk终极指南&#xff1a;Android设备的完整Root解决方案 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk Magisk是当前最先进的Android系统Root工具&#xff0c;它通过独特的系统分区掩码技术&#xf…

作者头像 李华