Q7
★ ★ ★ ★ ★
Vue 3 的编译器和运行时是如何分离的?
⚡ 速记答案(30 秒)
编译器:构建阶段把 template 编成 render 函数,做静态提升等优化。运行时:只包含响应式、虚拟 DOM、组件生命周期等逻辑,不带编译器,体积更小。
📖 详细讲解
标准面试回答(推荐记住)
Vue 3 将编译器和运行时分离。编译器在构建阶段把 template 编译成 render 函数,并做静态提升等优化;运行时只包含响应式系统、虚拟 DOM、生命周期等核心逻辑。如果用构建工具预编译,生产环境只需要 runtime 版本,体积更小。
@vue/compiler-sfc vs @vue/runtime-core
编译器 (Compiler):
负责将 Template 字符串转换为 JavaScript 渲染函数。
- Parser: 解析模板为 AST
- Transform: 处理指令 (v-if, v-for) 和优化 (静态提升)
- Codegen: 生成最终的 render 函数代码
运行时 (Runtime):
负责执行渲染函数并管理组件生命周期。
- Virtual DOM: 创建和比较 VNode
- Reactivity: 响应式数据驱动
- Renderer: 平台无关的渲染接口 (Web/Weex/etc)
好处
- 体积更小:预编译后,浏览器端不需要加载编译器代码(约减少 10+KB)。
- 性能更好:编译工作在构建时完成,运行时无额外开销。
✅ 面试要点
- •理解编译时和运行时的职责划分
- •知道静态提升等编译优化
- •了解不同版本的使用场景
💻 代码示例
编译器输出示例
// 模板
// <div class="container">
// <span>{{ message }}</span>
// </div>
// 编译后的 render 函数
import { createVNode as _createVNode, toDisplayString as _toDisplayString } from 'vue'
// 静态提升:静态节点只创建一次
const _hoisted_1 = { class: "container" }
function render(_ctx) {
return _createVNode("div", _hoisted_1, [
_createVNode("span", null, _toDisplayString(_ctx.message))
])
}