Skip to content

.vue 单文件组件编译流程

拆成三部分

一个 .vue 文件经过 vue-loader 后会被拆分为三类资源:<template><script><style>。这只是编译流程的入口,后续 VueLoaderPlugin 会将不同资源分发给对应的 webpack loader 继续处理。

三条流水线

Script 块babel-loader:将 TS / ES6+ 语法转换为目标浏览器可以执行的 JavaScript。Vue3 中常用的 <script setup> 也会在编译阶段处理,definePropsdefineEmits 这类宏会被转换为运行时所需的组件配置。

Style 块css-loader + style-loader:将 CSS 处理为可以被 JavaScript 注入页面的样式。如果带有 scoped 属性,编译器会为选择器追加唯一的 data-v-xxx 属性,从而实现组件级样式隔离,降低样式互相影响的风险。

Template 块vue-template-compiler(Vue2)/ @vue/compiler-sfc(Vue3):这是最关键的一步,把模板编译成 render 函数。Vue3 在这一步还做了静态提升和 Patch Flag 优化。

为什么需要这套编译流程

浏览器的能力边界很明确:它可以解析 HTML、CSS 和 JavaScript,但无法直接识别 .vue 文件、插值表达式 v-model 这类 Vue 模板语法。整个编译流程的本质,就是将 Vue 的组件语法转换为浏览器可以执行的标准资源。.vue 文件提升了组件组织效率,编译器负责将这种开发层面的抽象转换为运行时可执行的代码。