将虚拟DOM变为真实DOM并渲染到浏览器页面中
主要由三个部分组成:
当你在代码中修改了响应式数据,渲染器的流水线便开始运转:
数据变动触发组件的 effect 重新执行。为了性能,这个执行会被丢进调度器(Scheduler)的微任务队列中。
当微任务开始刷新,执行组件的 render 函数。此时编译器(Compiler)生成的代码会通过 h 函数或 createVNode 生成一棵全新的虚拟 DOM 树。
这是渲染器的核心逻辑。渲染器会拿着“新旧两棵树”进行对比。
编译器的作用是将模板编译为渲染函数
在传统的模板编译(如 Vue 2)中,即使一个 HTML 节点是完全静态的(内容永远不变),它也会被放在 render 函数内部。这意味着每次组件更新,这些静态节点都要被重新创建一遍 VNode。
Vue 3 编译器会识别出那些不带任何变量、指令或绑定属性的节点,将其提升到渲染函数之外。
// 编译前
<div>
<span class="label">姓名:</span>
<span>{{ name }}</span>
</div>
// 编译后(简化版)
const _hoisted_1 = _createVNode("span", { class: "label" }, "姓名:", -1 /* HOISTED */)
export function render(_ctx) {
return (_openBlock(), _createBlock("div", null, [
_hoisted_1, // 直接引用外部变量
_createVNode("span", null, _toDisplayString(_ctx.name), 1 /* TEXT */)
]))
}将模板字符串解析为 抽象语法树 (AST)。
这是编译器最核心的部分。它会递归遍历 AST,并应用一系列 插件(Plugins):
将优化后的 AST 转化为最终的渲染函数字符串。在这个阶段,它会根据转换阶段留下的线索,生成最精简的代码
