Vite(法语"快速")是新一代前端构建工具,由 Vue.js 作者尤雨溪创建。它利用浏览器原生 ES Module 和 esbuild 预构建实现极速开发服务器,生产构建则基于 Rollup 输出高度优化的静态资源。
| 维度 | Webpack | Vite |
|---|---|---|
| 冷启动 | 打包所有模块后启动(慢) | 按需编译,即刻启动(快) |
| HMR 速度 | 随项目规模线性增长 | 始终毫秒级(与规模无关) |
| 配置复杂度 | 高(Loader/Plugin/Resolve) | 低(开箱即用) |
| TypeScript | 需要 ts-loader/babel | 原生支持(esbuild 转译) |
| CSS 预处理器 | 需要配置 Loader | 内置支持 |
# npm
npm create vite@latest my-app -- --template react-ts
# pnpm(推荐)
pnpm create vite my-app --template vue-ts
# 可选模板
# vanilla / vue / react / preact / lit / svelte / solid / qwik
# 加 -ts 后缀使用 TypeScriptmy-app/
├── index.html ← 入口(Vite 以此为核心)
├── package.json
├── vite.config.ts ← 配置文件
├── tsconfig.json
├── public/ ← 静态资源(原样复制)
│ └── favicon.svg
└── src/
├── main.ts ← JS 入口
├── App.vue ← 根组件
├── style.css
└── components/与 Webpack 不同,Vite 以 index.html 为构建入口(而非 JS 文件)。HTML 中通过 <script type="module"> 引用源码:
<script type="module" src="/src/main.ts"></script>cd my-app
pnpm install
pnpm dev输出:
VITE v5.x.x ready in 120 ms
➜ Local: http://localhost:5173/
➜ Network: http://192.168.1.100:5173/pnpm build # 输出到 dist/
pnpm preview # 本地预览构建产物Vite 首次启动时使用 esbuild 将 node_modules 中的依赖预构建为 ESM:
node_modules/
lodash-es/ ← 数百个 ESM 文件
↓ esbuild 预构建
node_modules/.vite/
deps/
lodash-es.js ← 合并为单个文件
_metadata.json ← 缓存哈希预构建解决的问题:
Vite 的 HMR 基于原生 ESM:
# .env ← 所有环境加载
VITE_APP_TITLE=My App
# .env.development ← 仅开发环境
VITE_API_URL=http://localhost:3000
# .env.production ← 仅生产环境
VITE_API_URL=https://api.example.com代码中使用:
// 仅 VITE_ 前缀的变量暴露给客户端
const apiUrl = import.meta.env.VITE_API_URL
const isDev = import.meta.env.DEV // boolean
const isProd = import.meta.env.PROD // boolean
const mode = import.meta.env.MODE // 'development' | 'production'VITE_ 前缀的变量会被打包进客户端代码。不要在 .env 中存放密钥、Token 等敏感信息。
# 安装 Vite 和对应插件
pnpm add -D vite @vitejs/plugin-react
# 创建 vite.config.ts
# 将 index.html 移到项目根目录
# 修改 package.json scripts{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
}
}// vite.config.ts
import { defineConfig } from 'vite'
import { resolve } from 'path'
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'),
name: 'MyLib',
formats: ['es', 'cjs', 'umd'],
fileName: (format) => `my-lib.${format}.js`
},
rollupOptions: {
external: ['vue', 'react'],
output: {
globals: { vue: 'Vue', react: 'React' }
}
}
}
})| 命令 | 说明 |
|---|---|
vite | 启动开发服务器 |
vite build | 生产构建 |
vite preview | 预览构建产物 |
vite optimize | 手动触发依赖预构建 |
vite --port 3000 | 指定端口 |
vite --host | 暴露到局域网 |
vite build --watch | 监听模式构建 |
Vite 的依赖预构建对 pnpm 的符号链接结构有良好支持,且 pnpm 安装速度更快。
开发时通过代理解决跨域,避免 CORS 配置:
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}
})public/ 中的文件不经过 Vite 处理(无 hash、无压缩优化)。优先将资源放在 src/ 中通过 import 引用。