Vue3底层架构——编译器

news/2026/1/20 23:57:54/文章来源:https://www.cnblogs.com/haoxiugong/p/19509113

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

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

编译 .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: NodeTypesloc
}

常见节点类型:

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 {helperscomponentsdirectivescurrentNodeparent
}

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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1191239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极限科技荣膺 2025 金猿奖 — “年度国产化优秀代表厂商”,自主可控搜索方案 Easysearch 获行业高度认可

2026年1月14日,极限科技凭借其在分布式搜索型数据库领域的技术突破与卓越的国产化实践,成功入选《2025 中国大数据产业「年度国产化优秀代表厂商」》榜单近日于上海明捷万丽酒店成功举办的 “2025 第八届金猿大数据产…

为你的STM32毕设项目加点“料”:“AI智能按摩椅“健康按摩辅助系统

每年的这个时候&#xff0c;总能看到许多为毕业设计而发愁的同学。大家手里握着熟悉的STM32&#xff0c;知道它性能强大、控制精准&#xff0c;是完成毕设的可靠伙伴&#xff0c;但恰恰因为这份“可靠”&#xff0c;反而让选题变得困难——能做的东西似乎都被人做过了&#xff…

这两个专注于Skills的开源项目,正在GitHub上引发关注

这里写自定义目录标题欢迎使用Markdown编辑器新的改变test11111111234232343功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自…

【计算机毕业设计案例】人工智能基于python-CNN深度学习的番茄叶病害识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

掌握核心方法论,打造高质量业务仪表板

前言 在数字化运维与业务监控的实践中&#xff0c;仪表板&#xff08;Dashboard&#xff09;与汽车的仪表盘同等重要&#xff0c;它不仅是数据可视化的载体&#xff0c;更是团队快速定位问题、洞察数据趋势的核心工具。观测云在平台中内置了大量通用组件、云服务的仪表板模板。…

http和https区别、令牌、三次握手流程

一、HTTP 和 HTTPS 的区别&#xff08;必背&#xff09;1️⃣ 本质区别&#xff08;一句话&#xff09;HTTP 是明文传输&#xff0c;HTTPS 是在 HTTP 基础上加了一层 SSL/TLS 加密。2️⃣ 核心对比表对比项HTTPHTTPS是否加密❌ 明文✅ 加密安全性低高端口80443证书不需要需要 C…

为你的STM32毕设项目加点“料”:“AI智能桌面伙伴“姿态识别应用系统

每年的这个时候&#xff0c;总能看到许多为毕业设计而发愁的同学。大家手里握着熟悉的STM32&#xff0c;知道它性能强大、控制精准&#xff0c;是完成毕设的可靠伙伴&#xff0c;但恰恰因为这份“可靠”&#xff0c;反而让选题变得困难——能做的东西似乎都被人做过了&#xff…

深度学习的核心求梯度就是多维函数求导数

文章目录1. 深度学习的核心求梯度就是多维函数求导数2. 强化学习中的梯度上升更新&#x1f3af; 简单函数举例&#xff1a;单参数策略的期望回报梯度更新设定步骤1&#xff1a;求期望回报的梯度步骤2&#xff1a;梯度上升更新参数结果&#x1f9e9; 再看一个带基线的例子&#…

【课程设计/毕业设计】机器学习基于python-CNN深度学习的乐器识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

深度学习毕设项目推荐-基于python-CNN深度学习的乐器识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

靠谱的无线信道仿真软件排名:国际主流Ranplan的双产品解析

在无线通信技术向5G-A、6G演进的过程中&#xff0c;无线信道仿真软件的精度、兼容性与场景适配能力成为大多数用户的核心选型标准。如何寻找靠谱的无线信道仿真软件&#xff1f;国际主流工具的技术实力与行业适配性是关键评估维度。Ranplan Wireless 旗下的 Ranplan Profession…

2026必备!专科生毕业论文痛点全解TOP9 AI论文网站

2026必备&#xff01;专科生毕业论文痛点全解TOP9 AI论文网站 2026年专科生论文写作工具测评维度解析 随着高校教育的不断深化&#xff0c;专科生在毕业论文撰写过程中面临的问题愈发突出。从选题困难、资料查找繁琐到格式规范不熟悉&#xff0c;每一个环节都可能成为阻碍。为帮…

基于微信小程序的考研论坛【源码+文档+调试】

&#x1f525;&#x1f525;作者&#xff1a; 米罗老师 &#x1f525;&#x1f525;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f525;&#x1f525;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

深度学习计算机毕设之基于python-CNN深度学习卷神经网络的乐器识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【课程设计/毕业设计】机器学习基于python-CNN深度学习识别是否发生火灾

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

ARM嵌入式开发代码实践——LED灯闪烁+蜂鸣器报警(DSP版)

一、SDK简介与工程构建 1. SDK&#xff08;Software Development Kit&#xff09;概述 SDK是软件开发工具包&#xff0c;包含了&#xff1a; 头文件&#xff08;寄存器定义、函数声明&#xff09; 库文件&#xff08;编译好的函数实现&#xff09; 示例代码 文档和工具 …

孢子自动捕捉系统

作物病害多由真菌、细菌孢子传播引发&#xff0c;具有隐蔽性强、扩散快的特点&#xff0c;一旦爆发易造成大幅减产。传统病害防控多依赖人工巡查&#xff0c;难以及时捕捉早期孢子踪迹&#xff0c;往往陷入“见病才防治”的被动局面。孢子分析仪与孢子捕捉系统形成协同闭环&…

MoonBit 获日本最大技术社区Zenn原生支持,热度持续上升中!

近日&#xff0c;日本知名技术社区 Zenn 在 X &#xff08;原推特&#xff09;上表示&#xff0c;正式上线了对 MoonBit 语言&#xff08;.mbt&#xff09; 的语法高亮支持&#xff0c;此举意味着 MoonBit 现已可以在 Zenn &#xff08;zenn.dev&#xff09;平台上获得与主流编…

RPA重塑HR招聘生态:从效率工具到战略赋能的进阶之路

在数字化转型深度渗透的当下&#xff0c;企业人力资源管理正经历从“事务执行”到“战略统筹”的核心转变。其中&#xff0c;招聘模块作为人才引入的关键端口&#xff0c;传统模式下的简历筛选繁琐、跨系统协作不畅、入职流程碎片化等问题&#xff0c;逐渐成为制约企业人才竞争…