Skip to content
标签
note
字数
596 字
阅读时间
3 分钟

编译过程:template -> ast -> render 函数 -> 创建虚拟 DOM -> diff 算法更新虚拟 DOM ->产生、更新真实 DOM

Vue 的单页应用(SPA)中,.vue 单文件组件(SFC)的编译流程是将 .vue 文件转换为可在浏览器中运行的 JavaScript 代码的核心过程

.vue 文件包含模板(<template>)、脚本(<script>)、样式(<style>)三部分,其编译流程可分为构建时编译运行时渲染两个阶段,核心目标是将 SFC 转换为组件选项对象(如 render 函数、datamethods 等)。

1. 构建时编译(依赖构建工具如 Webpack/Vite)

这一阶段由 vue-loader(Webpack)或 @vitejs/plugin-vue(Vite)主导,将 .vue 文件拆分为三部分并分别处理:

  • 拆分 SFC 块:解析 .vue 文件,分离出 <template><script><style> 三个代码块。

  • 各自编译处理

    • 模板(template)

      通过 vue-template-compiler(Vue 2)或 @vue/compiler-sfc(Vue 3)将模板字符串编译为 render 函数(虚拟 DOM 描述代码)。例如:

      <div></div> 会被编译为类似 h('div', [ctx.msg]) 的函数(Vue 3 中为 createVNode)。

    • 脚本(script)

      通过 Babel 等工具将 ES6+ 语法转换为浏览器兼容的 JavaScript,提取组件选项(export default { data, methods, ... })。

    • 样式(style)

      若指定 scoped 或 module,会通过 postcss 处理(如添加作用域哈希类名),再由 css-loaderstyle-loader 等转换为可注入页面的样式。

  • 整合为组件模块

    将编译后的 render 函数、脚本导出的选项、样式引用整合为一个 JavaScript 模块,最终导出一个 Vue 组件对象。

2. 运行时渲染(浏览器中执行)

  • 编译后的组件模块被引入并注册到 Vue 应用中。
  • 当组件被渲染时,Vue 执行其 render 函数生成虚拟 DOM。
  • 虚拟 DOM 经过 diff 算法对比后,转换为真实 DOM 并挂载到页面

编译过程

  • 解析是将 .vue 文件 解析为 template、script 和 style 三个部分
  • 编译是指将 template 编译为渲染函数

https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0ae3d0ea2d744186965da7e2b5b22ab8~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp

参考

别再问我 vue 模版怎么编译了

Vue 文件解析、编译流程

贡献者

The avatar of contributor named as chenjie chenjie

页面历史

撰写