news 2026/3/14 15:27:11

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/3/13 13:51:24

Activepieces零基础入门:3步构建你的首个自动化工作流

Activepieces零基础入门&#xff1a;3步构建你的首个自动化工作流 【免费下载链接】activepieces Your friendliest open source all-in-one automation tool ✨ Workflow automation tool 100 integration / Enterprise automation tool / ChatBot / Zapier Alternative 项目…

作者头像 李华
网站建设 2026/3/14 9:33:12

5分钟部署VibeThinker-1.5B,数学编程推理一键上手

5分钟部署VibeThinker-1.5B&#xff0c;数学编程推理一键上手 你是否也遇到过这样的场景&#xff1a;刷LeetCode卡在一道动态规划题&#xff0c;思路断了&#xff1b;准备算法竞赛却找不到能精准推导的辅助工具&#xff1b;写数学证明时逻辑链总是不完整&#xff1f;市面上的大…

作者头像 李华
网站建设 2026/3/14 3:27:58

fft npainting lama适合人像修复吗?面部瑕疵实测报告

fft npainting lama适合人像修复吗&#xff1f;面部瑕疵实测报告 1. 引言&#xff1a;我们为什么需要人像修复工具&#xff1f; 你有没有遇到过这种情况&#xff1a;一张特别满意的照片&#xff0c;却因为脸上的一颗痘印、一道划痕&#xff0c;或者不小心入镜的杂物破坏了整体…

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

verl批处理优化:提高GPU利用率的实战技巧

verl批处理优化&#xff1a;提高GPU利用率的实战技巧 1. verl 是什么&#xff1f;为什么它值得你关注 verl 不是一个抽象概念&#xff0c;而是一个真正跑在 GPU 上、能让你的 LLM 后训练任务“动起来”的工具。它不是实验室里的玩具&#xff0c;而是字节跳动火山引擎团队为真…

作者头像 李华
网站建设 2026/3/13 12:02:18

5步搞定FSMN-VAD部署,语音分析效率翻倍

5步搞定FSMN-VAD部署&#xff0c;语音分析效率翻倍 你是否还在为长音频中夹杂大量静音段而烦恼&#xff1f;手动切分不仅耗时耗力&#xff0c;还容易出错。在语音识别、会议转录、智能客服等场景中&#xff0c;如何快速精准地提取有效语音片段&#xff0c;是提升后续处理效率的…

作者头像 李华
网站建设 2026/3/14 11:45:59

OCR检测速度有多快?cv_resnet18_ocr-detection性能实测对比

OCR检测速度有多快&#xff1f;cv_resnet18_ocr-detection性能实测对比 1. 引言&#xff1a;我们为什么关心OCR检测速度&#xff1f; 你有没有遇到过这样的场景&#xff1a;上传一张图片&#xff0c;等了三四秒才出结果&#xff0c;页面卡在那里一动不动&#xff1f;或者批量…

作者头像 李华