Vite 之所以快,不只是因为用了原生 ES 模块,更在于它围绕开发体验做了一系列务实的工程设计。其中插件体系、按需加载和预构建优化,是决定项目可维护性和构建性能的三大支柱。
插件体系:用插件扩展 Vite 的能力边界
Vite 本身只提供最核心的构建和开发服务器能力,所有非核心功能都通过插件来实现,包括对 Vue 单文件组件的支持(@vitejs/plugin-vue)、TypeScript 编译、CSS 预处理等。这种设计让 Vite 的内核保持轻量,而功能边界由插件决定。
实用原则:
- 插件是标准的 npm 包,在
vite.config.js中通过plugins数组引入,多数插件提供零配置选项。 - 对于 Vue 项目,
@vitejs/plugin-vue是必须的,它负责将.vue文件编译为 JS 和 CSS。 - 常见的官方及社区插件包括:
@vitejs/plugin-vue-jsx:支持 JSX 语法。vite-plugin-pages:基于文件系统自动生成路由。unplugin-auto-import:自动导入 Vue API 等,减少手动 import。vite-plugin-compression:构建时生成 gzip/brotli 压缩文件。
真实体感:
当你需要一个能力(比如自动导入组件),不需要修改 Vite 源码或等官方更新,只需安装一个插件并配置。这与 Vue 本身的渐进式思路一致——按需装载,避免了“全家桶”的臃肿。
按需加载:只把当前页面需要的代码交给用户
“按需加载”并非一个独立配置项,而是一种贯穿开发与构建环节的策略,用于保证最终产物体积最小。
对组件库的按需引入
像 Element Plus、Ant Design Vue 等大型组件库,全量引入会让打包体积轻松膨胀数 MB。它们的官方文档都提供了对应的按需引入方案,通常借助 unplugin-vue-components 插件即可实现:
// vite.config.js
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default {
plugins: [
Components({
resolvers: [ElementPlusResolver()]
})
]
}
配置后,你用 <el-button> 时插件会自动导入对应组件的 JS 和样式,其余 99% 的组件不会打进最终包。同样的模式也适用于自定义的组件库和工具函数库(如 lodash 的 lodash-es + Tree Shaking)。
路由级别的代码分割
Vue Router 配合动态 import() 天然支持路由级别的懒加载:
const UserProfile = () => import('./views/UserProfile.vue')
这样该页面的所有 JS、CSS 和组件依赖都会被独立打包,只有当用户真正访问该路由时才会请求这段代码。这是大型 SPA 首屏优化的基本操作,无需额外插件。
组件级的异步加载
对于体积较大但并非首屏必需的组件(如富文本编辑器、图表),可以用 defineAsyncComponent 实现点击或可见时才加载:
import { defineAsyncComponent } from 'vue'
const Chart = defineAsyncComponent(() => import('./HeavyChart.vue'))
这些策略共同构成“按需加载”体系,核心目的只有一个:让用户下载的代码刚好够用,不多不少。
预构建优化:把“慢”的东西提前处理好
开发时,Vite 在冷启动阶段会执行依赖预构建,它解决了两个关键问题:
- 将 CommonJS 模块转为 ESM
Vite 的开发服务器基于原生 ES 模块,但许多 npm 包(如 lodash、axios)仍提供 CommonJS 格式。Vite 会用 esbuild 将它们统一转化成 ESM,并合并成一个文件,避免浏览器发出密密麻麻的请求。
- 重写裸模块导入路径
代码中 import { ref } from 'vue' 这种“裸模块”浏览器无法解析。预构建时 Vite 会把这些引用重写为如 /node_modules/.vite/deps/vue.js?v=... 的合法路径,同时处理依赖间的深层次引用。
为什么预构建优化对开发速度重要
一些包内部可能包含成百上千个内部模块(比如 lodash-es),如果不做合并,浏览器在加载一个组件时可能会产生数百个请求,导致开发服务器卡顿。预构建后,这些包被合并成少量文件,结合 HTTP/2 的多路复用,请求效率大幅提升。
缓存策略
预构建的结果会被缓存到 node_modules/.vite 目录下。除非依赖版本变化或配置调整,否则 Vite 只会执行一次预构建。二次启动时几乎瞬间就绪。
对生产构建的影响
预构建是开发时的概念,生产打包则由 Rollup 接管。但 Vite 插件生态中常用的 unplugin-vue-components、unplugin-auto-import 等会在生产构建时继续工作,保证按需加载策略从开发到上线一致。
总结一句话:Vite 用插件让扩展变得随意,用按需加载让产物保持小巧,用预构建让开发反馈迅捷——这三者结合起来,就是现代 Vue 项目“开箱即快”的工程基础。