Skip to content

.vue 文件的本质是什么

在 Vue 3 项目中,.vue 文件的本质是一个单文件组件(Single File Component,简称 SFC)。它是 Vue 生态提供的一种源码组织格式,把模板(template)、**脚本(script)样式(style)**写在同一个文件中。

可以先记这个:

.vue 不是浏览器能直接运行的格式,而是 Vue 生态定义的一种“组件源码格式”,需要先经过 SFC 编译器和构建工具处理,才能变成浏览器可加载的模块。

.vue 文件的结构

一个典型的 .vue 文件结构如下:

vue
<script setup>
import { ref } from 'vue'

const message = ref('Hello Vue 3')
</script>

<template>
  <div>{{ message }}</div>
</template>

<style scoped>
div {
  color: blue;
}
</style>

它通常包含以下三部分:

  • <template>:描述组件的模板结构,后续会被编译成渲染函数
  • <script><script setup>:包含 JavaScript 逻辑(响应式、数据、方法等)
  • <style>:CSS 样式,可以通过 scoped 实现样式作用域隔离

.vue 文件的本质是什么

.vue 文件是一种自定义源码格式,由 Vue 官方定义,需要借助构建工具解析和转换:

  • Vite 项目通常通过 @vitejs/plugin-vue 处理。
  • Webpack 项目通常通过 vue-loader 处理。

它们都会调用 @vue/compiler-sfc 把 SFC 拆成脚本、模板、样式等部分,再交给后续编译链路继续处理。

解析过程大致如下:

  1. 构建工具读取 .vue 文件
  2. 使用专门的插件将 .vue 文件解析成多个代码块
  3. 模板部分会被编译成 JavaScript 的渲染函数
  4. 脚本部分成为组件逻辑
  5. 样式部分会被转换为 CSS 资源或开发态样式模块,支持 scoped、CSS Modules 等功能

一个入口,多个产物

开发时你看到的是一个 .vue 文件,但构建工具看到的通常不是“一个东西”,而是多个彼此关联的模块:

  • 脚本模块
  • 模板编译得到的渲染函数模块
  • 样式模块
  • 以及描述这些模块如何重新组合的辅助逻辑

这也是为什么在 vite dev 模式下,你经常会在网络面板里看到带 ?vue&type=... 查询参数的请求。

.vue 文件是浏览器能直接识别的吗

不是。.vue 文件并不是浏览器原生支持的格式。它**需要被构建工具预处理(编译)**成 JavaScript 模块和 CSS 资源,才能运行在浏览器中。

你可以在运行 Vue 项目时直接打开控制台,查看 Sources 这个 tab,看看浏览器中 .vue 文件到底是什么。

你会看到 Vite 开发态是按需实时编译 Vue 的,样式也常被转成 JavaScript 模块,再通过运行时代码注入到页面中。

为什么 Vue 要用这种文件形态

.vue 文件的价值不只是“把模板、脚本、样式写在一起”,更重要的是它给编译器提供了一个统一入口,让 Vue 可以在一个地方同时理解:

  • 组件逻辑
  • 模板结构
  • 样式作用域
  • 类型信息
  • 编译宏

这也是很多语法糖能成立的原因。换成普通 js/ts 文件,某些能力就很难以同样的方式表达。

小结

方面说明
文件类型自定义源码格式(.vue)
本质模板 + 脚本 + 样式的组合入口
作用用于定义 Vue 单文件组件
编译入口@vue/compiler-sfc
构建集成@vitejs/plugin-vue / vue-loader
浏览器支持需要编译后才能运行

展望:Vapor Mode

Vue 团队正在探索 Vapor Mode。这是一种新的编译策略方向,目标是把模板进一步编译为更细粒度的更新逻辑,减少通用虚拟 DOM 路径的开销。

这意味着 .vue 文件的本质不会改变,依然是模板 + 脚本 + 样式的组合,但未来编译产物形态可能出现明显变化。

由于该方向仍在持续演进,具体能力和落地形态请以官方发布说明为准。

接着读

读完后可以继续看:

  1. script setup 的本质
  2. style scoped 的本质
  3. Vite dev / build 下的 Vue 产物

这样能把 .vue 文件的“输入形态”和“最后产物”完整连起来。

Released under the CC BY-NC-SA 4.0 License.