Vite(法语意为”快速”)是一个现代化的前端构建工具,由 Vue.js 作者尤雨溪开发。它解决了传统构建工具(如 Webpack)在开发环境启动慢、HMR(热更新)响应慢的问题。
// Vite 在不同环境采用不同策略
{
dev: {
// 开发环境:基于浏览器原生 ES Modules
strategy: "ESM + No-Bundle"
},
prod: {
// 生产环境:基于 Rollup 打包
strategy: "Bundle (Rollup)"
}
}
Vite 的核心创新在于开发环境完全不打包,直接利用浏览器原生支持的 ES Modules:
<!-- 传统方式:打包后单个文件 -->
<script src="bundle.js"></script>
<!-- Vite 方式:直接使用原生 ES Modules -->
<script type="module" src="/src/main.js"></script>
// 浏览器请求流程
浏览器请求 → Vite 服务器拦截 → 按需编译 → 返回浏览器
// 示例:请求一个 Vue 组件
// 浏览器请求:/src/components/Hello.vue
// Vite 实时编译为 JS 返回
// vite.config.js
export default {
optimizeDeps: {
// 预构建依赖,解决 CommonJS 转换和依赖嵌套问题
include: ["vue", "vue-router", "lodash-es"],
},
};
预构建目的:
// 简化版 Vite 中间件原理
const transformMiddleware = async (req, res, next) => {
if (req.url.endsWith(".vue")) {
// 1. 读取 Vue 文件
const content = await fs.readFile(filepath);
// 2. 编译为 JS
const { code } = compileVue(content);
// 3. 响应给浏览器
res.setHeader("Content-Type", "application/javascript");
res.end(code);
}
};
// Vite 特殊的导入解析
import { ref } from "vue"; // → /node_modules/.vite/vue.js
import App from "./App.vue"; // → 实时编译
import "/src/style.css?import"; // → 作为模块处理
import("lodash/debounce"); // → 动态导入,按需加载
// Vite HMR 工作流程
1. 文件修改 → 2. Vite 检测变化 → 3. 编译单个文件
↓
4. 通过 WebSocket 通知浏览器
↓
5. 浏览器接收 HMR 更新
↓
6. 执行更新回调,替换模块
// HMR API 示例
if (import.meta.hot) {
import.meta.hot.accept('./module.js', (newModule) => {
// 更新逻辑
})
}
node_modules/.vite/
├── deps/ # 预构建的依赖
│ ├── vue.js
│ └── vue-router.js
├── _hmrPayload.js # HMR 更新数据
└── cache/ # 编译缓存
// Vite 插件结构
const myPlugin = {
name: 'my-plugin',
// 配置钩子
config: (config) => { /* 修改配置 */ },
// 转换钩子
transform: (code, id) => { /* 转换代码 */ },
// 热更新钩子
handleHotUpdate: (ctx) => { /* 处理热更新 */ }
}
// 插件执行顺序
1. 配置解析 → 2. 依赖预构建 → 3. 开发服务器启动
↓
4. 请求拦截 → 5. 插件处理 → 6. 返回响应
// 不同类型文件的处理流程
{
'.js': '直接返回',
'.ts': 'ts → js (esbuild)',
'.vue': 'Vue 单文件组件编译',
'.css': 'CSS Modules 处理',
'.scss': 'Sass 编译 → CSS',
'.jsx/.tsx': 'React 组件编译'
}
// 传统打包工具(Webpack)
启动时间 = 解析所有模块 + 构建依赖图 + 打包整个应用
// Vite
启动时间 = 启动服务器 + 预构建核心依赖
(毫秒级) (仅首次)
// Webpack HMR
更新文件 → 重新构建依赖图 → 重新打包 → 浏览器更新
(较慢,随项目增大而变慢)
// Vite HMR
更新文件 → 编译单个文件 → 浏览器更新
(极快,与项目大小无关)
// 只在需要时编译
浏览器请求 /src/foo.vue → 编译 foo.vue
浏览器请求 /src/bar.vue → 编译 bar.vue
// 未访问的文件不编译
// vite.config.js
export default {
build: {
// Rollup 配置
rollupOptions: {
input: "src/main.js",
output: {
format: "es",
dir: "dist",
},
},
// 构建优化
minify: "terser", // 代码压缩
cssCodeSplit: true, // CSS 代码分割
sourcemap: true, // 生成 sourcemap
target: "es2015", // 目标环境
},
};
| 特性 | Vite | Webpack |
|---|---|---|
| 启动速度 | 极快(毫秒级) | 慢(随项目增大) |
| HMR 速度 | 极快(文件级) | 较慢(模块图级) |
| 构建原理 | 开发不打包,生产用 Rollup | 始终打包 |
| 配置复杂度 | 简单,约定优于配置 | 复杂,高度可配置 |
| 生态 | 增长迅速,兼容 Rollup 插件 | 非常成熟 |
// vite.config.js 完整示例
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "path";
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
"@": path.resolve(__dirname, "src"),
},
},
server: {
port: 3000,
proxy: {
"/api": "http://localhost:8080",
},
},
build: {
outDir: "dist",
assetsDir: "assets",
rollupOptions: {
output: {
manualChunks: {
vendor: ["vue", "vue-router"],
utils: ["lodash", "axios"],
},
},
},
},
});
Vite 的核心优势在于:
Vite 代表了前端构建工具的新方向,通过充分利用现代浏览器的能力,大幅提升了开发体验。随着生态的不断完善,Vite 正在成为越来越多项目的首选构建工具。