Vite是Vue.js作者尤雨溪开发的下一代前端构建工具,开发环境利用浏览器原生ES模块实现按需加载,生产环境基于Rollup打包。相比Webpack的Bundle模式,Vite的Dev Server冷启动可在毫秒级完成,HMR(热模块替换)速度不受项目规模影响,已成为Vue3生态和React框架项目的首选构建工具。
Vite构建原理与依赖预构建机制
Vite的开发服务器分两条路径处理模块:依赖(node_modules中的包)和应用源码。依赖通过esbuild预构建(Pre-bundling)为ESM格式并缓存,源码直接按需通过浏览器加载。这种设计避免了Webpack需要全量打包后才能启动开发服务器的问题。
预构建过程将CommonJS/UMD依赖转换为ESM,同时将多入口依赖合并为单文件减少HTTP请求数。手动配置预构建行为:
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'~components': resolve(__dirname, 'src/components')
}
},
optimizeDeps: {
include: ['vue', 'vue-router', 'pinia', 'axios', 'echarts'],
exclude: ['@vue/devtools'],
esbuildOptions: {
target: 'es2020',
define: {
global: 'globalThis'
}
}
},
server: {
port: 3000,
host: '0.0.0.0',
open: true,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
configure: (proxy) => {
proxy.on('error', (err) => {
console.log('proxy error', err)
})
}
},
'/ws': {
target: 'ws://localhost:8080',
ws: true
}
}
}
})
插件系统与自定义插件开发
Vite插件基于Rollup插件接口扩展,增加了Vite特有的hook(如configureServer用于开发服务器、transformIndexHtml用于HTML处理)。编写自定义插件可以接入编译流程的各个阶段。
// vite-plugin-auto-import.ts
import type { Plugin } from 'vite'
interface AutoImportOptions {
imports: Record<string, string[]>
exclude?: string[]
}
export function autoImport(options: AutoImportOptions): Plugin {
const { imports, exclude = [] } = options
return {
name: 'vite-plugin-auto-import',
enforce: 'pre',
configureServer(server) {
console.log('[auto-import] Server started')
},
transform(code, id) {
if (exclude.some(pattern => id.includes(pattern))) return null
if (!id.endsWith('.vue') && !id.endsWith('.ts') && !id.endsWith('.tsx')) {
return null
}
const importStatements = Object.entries(imports)
.map(([pkg, members]) => {
const named = members.filter(m => m !== 'default')
const hasDefault = members.includes('default')
const namedStr = named.length > 0 ? `{ ${named.join(', ')} }` : ''
const defaultStr = hasDefault ? 'DefaultExport' : ''
const combined = [defaultStr, namedStr].filter(Boolean).join(', ')
return `import ${combined} from '${pkg}'`
})
.join('\n')
return {
code: `${importStatements}\n${code}`,
map: null
}
},
transformIndexHtml(html) {
return html.replace(
'<!-- inject -->',
'<script>console.log("Built at: " + new Date().toISOString())</script>'
)
}
}
}
生产环境构建优化与分包策略
生产构建时Vite使用Rollup进行Tree Shaking和代码分割。通过manualChunks配置分包策略,将第三方依赖与业务代码分离,利用浏览器缓存减少重复下载。
// vite.config.ts (生产构建配置)
export default defineConfig({
build: {
target: 'es2018',
outDir: 'dist',
assetsDir: 'assets',
sourcemap: false,
minify: 'esbuild',
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
if (id.includes('vue') || id.includes('pinia')) {
return 'vue-vendor'
}
if (id.includes('echarts') || id.includes('zrender')) {
return 'echarts-vendor'
}
if (id.includes('lodash')) {
return 'lodash-vendor'
}
return 'vendor'
}
},
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash].[ext]'
}
},
chunkSizeWarningLimit: 1000,
cssCodeSplit: true,
cssMinify: 'esbuild'
},
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`
}
}
}
})
资源处理与PWA集成
静态资源通过import引用时Vite自动处理路径和哈希。图片小于assetsInlineLimit(默认4KB)会被转为Base64内联,大于阈值的输出为独立文件。PWA支持通过vite-plugin-pwa插件实现:
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
vue(),
VitePWA({
registerType: 'autoUpdate',
includeAssets: ['favicon.svg', 'robots.txt'],
manifest: {
name: 'My App',
short_name: 'App',
theme_color: '#1890ff',
icons: [
{
src: '/icon-192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: '/icon-512.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable'
}
]
},
workbox: {
globPatterns: ['**/*.{js,css,html,svg,png,woff2}'],
runtimeCaching: [
{
urlPattern: /^https:\/\/api\./,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
expiration: { maxEntries: 100, maxAgeSeconds: 3600 }
}
},
{
urlPattern: /\.(?:png|jpg|webp)$/,
handler: 'CacheFirst',
options: {
cacheName: 'image-cache',
expiration: { maxEntries: 200, maxAgeSeconds: 86400 * 30 }
}
}
]
}
})
]
})
Vite的构建性能优势主要来自esbuild——Go语言编写的JS/TS编译器,比Babel快10-100倍。在大型项目中,Vite生产构建速度通常比webpack快2-5倍,开发服务器冷启动可以从分钟级降到毫秒级。对于从Webpack迁移的项目,Vite兼容大部分webpack配置语义,迁移成本主要集中在自定义loader到plugin的改写上。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/vite-gou-jian-gong-ju-shen-du-pei-zhi-yu-sheng-chan-huan/