网站首页 > 技术文章 正文
当我们写下 <div>{{ msg }}</div> 时,浏览器看到的既不是标签,也不是文本,而是一段可执行的 JavaScript 函数。这道转换由 Vue 的模板编译器完成:它把纯文本一步步转化为渲染函数,并在此过程中完成静态提升、指令降级、依赖标记等优化。
一、为什么需要编译器?
- 声明式语法降低开发负担,开发者只需描述“想要什么”。
- 运行时性能通过预编译得到保证:静态节点被提升、动态节点被打补丁。
- 多端统一:同一套模板可输出 DOM、小程序、Canvas 渲染函数。
二、编译器三步流水线概览
- 解析 (Parse) 有限状态机把字符串切成 Token,再组装成 AST。
- 转换 (Transform) 在 AST 上完成静态提升、表达式提取、指令转换。
- 生成 (Generate) 将优化后的 AST 拼接成可执行的渲染函数字符串。
三、解析阶段:有限状态机逐字符扫描
以 <p>Vue</p> 为例,编译器内部维护一个状态机:
- 初始状态读到 < → 进入标签开始状态
- 读到字母 → 收集标签名
- 读到 > → 完成开始标签,创建 AST 节点并入栈
- 读到文本 → 创建文本节点挂到栈顶
- 读到 </ → 结束标签,弹出栈顶节点
每一步都伴随字符消费和状态转移,最终得到结构化 AST:
四、转换阶段:AST 上的优化魔法
Vue 在此阶段完成三项关键优化:
- 静态提升:不含响应式数据的节点被提升到渲染函数外部,避免重复创建。
- 表达式提取:{{ msg }} 被编译为 _ctx.msg,运行时直接取值。
- 指令转换:v-if、v-for 被降维为三元表达式或循环语句,减少运行时分支判断。
五、生成阶段:AST → 渲染函数
遍历优化后的 AST,拼接字符串:
生成的渲染函数可直接 new Function(code) 实例化,运行时零解析开销。
工程意义
- 编译时优化:PatchFlag、Block Tree 把 diff 复杂度降到 O(n)。
- Tree-Shaking:未使用语法在编译阶段删除,减小包体积。
- 多端渲染:同一套 AST 可以生成 DOM、小程序、Canvas 渲染函数。
猜你喜欢
- 2025-09-18 webapi 全流程_webapi一般干什么用的
- 2025-09-18 仅需 15 行 Python 代码,即可将视频文件转录为文本稿件
- 2025-09-18 深入解析 Spring Boot3 中 RestFul 接口参数校验
- 2025-09-18 SpringBoot 自研运行时 SQL 调用树,3 分钟定位慢 SQL!
- 2025-09-18 切片上传的完整实现流程(前端 + 后端)
- 2024-12-12 一款一站式、开源、高质量的数据提取工具(支持PDF/网页/多格式电子书提取)
- 2024-12-12 福岛核电站核残渣试提取工作启动
- 2024-12-12 如何自动识别CAD图中所有表格数据并导出
- 2024-12-12 日本福岛核电站核残渣试提取工作重启
- 2024-12-12 如何在网页中使用 web 字体?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)