Evan You 在 2021 年 1 月發佈了 Vite 2.0 正式版。和 1.0 相比,這幾乎是一次完全重寫——最大的變化是框架無關,不再只服務 Vue 生態。作為一個從 Webpack 1 時代一路用過來的前端,Vite 給我的感受不只是"快",而是開發體驗的全面升級。
為什麼 Vite 這麼快
傳統構建工具(Webpack、Rollup)在開發階段需要先打包整個應用,再啓動 dev server。項目越大,冷啓動越慢。Vite 的思路完全不同:
Webpack: 源碼 → 打包成 bundle → 啓動 dev server → 瀏覽器加載 bundle
Vite: 啓動 dev server → 瀏覽器按需請求模塊 → 逐個編譯
核心原理是利用瀏覽器原生 ES Module 支持。開發時不打包,只在瀏覽器請求時按需編譯:
// 瀏覽器請求這個文件時,Vite 才做編譯
// src/App.vue → 編譯後返回給瀏覽器
import { createApp } from 'vue' // 這個也會被瀏覽器逐個請求
import App from './App.vue'
createApp(App).mount('#app')
冷啓動時間從 Webpack 的 30-60 秒降到 1 秒以內,這不是理論值,是實際項目中的感受。
框架無關:不止 Vue
Vite 2.0 的插件系統兼容 Rollup,同時支持多種框架:
# Vue 3
npm init vite@latest my-vue-app -- --template vue
# React
npm init vite@latest my-react-app -- --template react
# Preact
npm init vite@latest my-preact-app -- --template preact
# Svelte
npm init vite@latest my-svelte-app -- --template svelte
我最近把一個 React 項目從 CRA 遷移到 Vite,冷啓動從 45 秒降到了 1.2 秒,HMR 基本感覺不到延遲。
插件系統
Vite 2.0 的插件 API 基於 Rollup 插件接口擴展,寫過 Rollup 插件的前端幾乎沒有學習成本:
// vite-plugin-my-feature.js
export default function myPlugin() {
return {
name: 'vite-plugin-my-feature',
// 開發階段的鈎子
transformIndexHtml(html) {
return html.replace(
'<head>',
'<head>\n<script>window.__APP_VERSION__ = "1.0.0"</script>'
)
},
// 處理特定文件
transform(code, id) {
if (id.endsWith('.svg')) {
return `export default ${JSON.stringify(code)}`
}
},
// 配置 dev server
configureServer(server) {
server.middlewares.use('/api/mock', (req, res) => {
res.end(JSON.stringify({ data: 'mock' }))
})
}
}
}
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import myPlugin from './vite-plugin-my-feature'
export default defineConfig({
plugins: [vue(), myPlugin()],
resolve: {
alias: {
'@': '/src'
}
}
})
和 Webpack 的本質區別
| 維度 | Webpack 4/5 | Vite 2 | | ------|------------|--------| | 開發構建 | 全量打包 | 按需編譯 | | 生產構建 | webpack | Rollup | | 冷啓動 | 慢(和項目大小正相關) | 快(幾乎無關) | | HMR | 需重新構建受影響的模塊鏈 | 精確更新,只處理變更的模塊 | | 配置 | 複雜,loader + plugin | 簡潔,Rollup 兼容插件 |
一個容易忽略的點:Vite 生產構建用的是 Rollup,Rollup 在 tree-shaking 和代碼優化上本來就是業界最好的選擇。等於開發用 Vite 的按需策略,生產用 Rollup 的成熟打包,兩頭都最優。
從 Webpack 遷移的實際經驗
# 1. 安裝 Vite
npm install -D vite @vitejs/plugin-vue
# 2. 修改 package.json
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
}
}
# 3. 創建 vite.config.ts
幾個常見的遷移坑:
// ❌ process.env 在 Vite 中不可用(開發階段是 ESM,沒有 Node 環境)
const apiUrl = process.env.VUE_APP_API_URL
// ✅ 使用 import.meta.env,前綴改為 VITE_
const apiUrl = import.meta.env.VITE_API_URL
// .env 文件
// VUE_APP_API_URL=https://api.example.com → VITE_API_URL=https://api.example.com
// ❌ require() 不可用
const modules = require.context('./modules', true, /\.ts$/)
// ✅ 改為 ESM 動態導入
const modules = import.meta.glob('./modules/**/*.ts')
// 懶加載版本
const modules = import.meta.glob('./modules/**/*.ts') // 返回懶加載函數
CSS 預處理器不用額外配置 loader,安裝依賴即可:
npm install -D sass
# 完了,直接在 .vue 文件裏用 lang="scss" 就行
還不成熟的地方
公平地説,Vite 2.0 也有一些不足:
- CommonJS 依賴:開發階段需要預構建(esbuild),偶爾遇到兼容問題
- SSR 支持:基礎框架有了,但還不像 Nuxt 那樣開箱即用
- 生態:插件數量和 Webpack 比還有差距,但核心場景覆蓋得差不多了
- 老舊瀏覽器:默認只支持原生 ESM 的瀏覽器,需要兼容 IE 的項目暫時不適合
小結
- Vite 2.0 不只是"快",是從架構層面改變了前端構建工具的範式
- 框架無關,Vue/React/Svelte 都能用,Rollup 插件兼容降低了遷移成本
- 遷移注意
process.env→import.meta.env、require→import - 新項目建議直接用 Vite;老項目可以評估遷移成本
- 2021 年前端構建工具的競爭格局變了,Vite 是一個認真的選擇