Vite是新一代前端构建工具,基于浏览器原生ESM(ES Modules)实现开发阶段的按需加载,生产环境使用Rollup打包。相比Webpack,Vite在开发服务器启动速度和HMR热更新响应上具有数量级优势,已成为Vue3和React项目的首选构建工具。本文覆盖Vite配置文件结构、插件开发、构建优化和生产部署方案。
Vite开发服务器与ESM模块加载原理
Vite的开发服务器利用浏览器原生ESM支持,将源码按模块粒度按需编译。浏览器请求某个模块时,Vite拦截请求并即时编译,只有被引用的模块才会被处理。这与Webpack的先打包再启动模式有本质区别,项目体积增大时启动时间不会显著增长。
创建Vite项目并初始化配置:
# 创建项目
npm create vite@latest my-app -- --template vue-ts
# 目录结构
my-app/
├── index.html # 入口HTML
├── vite.config.ts # Vite配置文件
├── tsconfig.json
├── src/
│ ├── main.ts # 应用入口
│ ├── App.vue
│ └── components/
└── public/ # 静态资源
vite.config.ts核心配置项与路径别名
Vite配置文件支持TypeScript类型提示,通过defineConfig函数提供自动补全。常用配置包括路径别名resolve.alias、开发服务器proxy、构建选项build、插件plugins。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import { resolve } from 'path'
export default defineConfig({
plugins: [
vue(),
AutoImport({
imports: ['vue', 'vue-router', 'pinia'],
dts: 'src/auto-imports.d.ts'
})
],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'@components': resolve(__dirname, 'src/components'),
'@utils': resolve(__dirname, 'src/utils')
}
},
server: {
host: '0.0.0.0',
port: 3000,
open: true,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
},
'/ws': {
target: 'ws://localhost:8080',
ws: true
}
}
},
build: {
target: 'es2015',
outDir: 'dist',
assetsDir: 'assets',
sourcemap: false,
chunkSizeWarningLimit: 500,
rollupOptions: {
output: {
manualChunks: {
'vue-vendor': ['vue', 'vue-router', 'pinia'],
'ui-vendor': ['element-plus'],
'utils-vendor': ['axios', 'lodash-es']
}
}
}
}
})
Vite插件开发与常用插件集成
Vite插件基于Rollup插件接口扩展,新增了enforce(前置/后置)、apply(serve/build)等Vite特有属性。开发一个自定义插件需要实现特定的钩子函数:
import type { Plugin } from 'vite'
// 自定义插件:在HTML中注入构建时间戳
function buildTimestampPlugin(): Plugin {
return {
name: 'build-timestamp',
enforce: 'pre',
transformIndexHtml(html) {
const timestamp = new Date().toISOString()
return html.replace(
'',
`<meta name="build-time" content="${timestamp}">`
)
}
}
}
// 自定义插件:开发环境Mock数据
function mockPlugin(mockData: Record): Plugin {
return {
name: 'mock-server',
apply: 'serve',
configureServer(server) {
server.middlewares.use((req, res, next) => {
if (req.url?.startsWith('/mock/')) {
const key = req.url.replace('/mock/', '')
if (mockData[key]) {
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify(mockData[key]))
return
}
}
next()
})
}
}
}
常用第三方插件集成:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { visualizer } from 'rollup-plugin-visualizer'
export default defineConfig({
plugins: [
vue(),
// 组件按需自动导入
Components({
resolvers: [ElementPlusResolver()],
dts: 'src/components.d.ts'
}),
// 构建产物分析
visualizer({
open: true,
filename: 'dist/stats.html',
gzipSize: true
})
]
})
构建优化与代码分割策略
生产环境构建优化是前端工程化的关键环节。Vite基于Rollup的构建能力支持多种优化策略。manualChunks配置将第三方依赖单独拆包,避免业务代码变更导致vendor缓存失效。CSS代码分割默认开启,按路由和组件维度拆分样式文件。
build: {
// CSS代码分割
cssCodeSplit: true,
rollupOptions: {
output: {
// 资源文件名哈希化
chunkFileNames: 'assets/js/[name]-[hash].js',
entryFileNames: 'assets/js/[name]-[hash].js',
assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
manualChunks(id) {
if (id.includes('node_modules')) {
if (id.includes('element-plus')) return 'ui'
if (id.includes('@vue')) return 'vue-core'
if (id.includes('echarts')) return 'charts'
return 'vendor'
}
}
}
},
// 压缩配置
minify: 'terser',
terserOptions: {
compress: {
drop_console: true, // 移除console
drop_debugger: true
}
}
}
生产环境部署与CDN资源外部化
生产环境构建时可将体积较大的第三方库通过CDN加载,减少打包体积。Vite通过rollupOptions.external配置外部化依赖,同时在HTML中引入CDN链接:
// vite.config.ts
export default defineConfig({
build: {
rollupOptions: {
external: {
'vue': 'Vue',
'vue-router': 'VueRouter',
'element-plus': 'ElementPlus'
}
}
}
})
// index.html 引入CDN
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-plus/dist/index.css">
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router@4/dist/vue-router.global.prod.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-plus/dist/index.full.min.js"></script>
</head>
Vite的构建优化还包括图片资源处理,小于assetsInlineLimit(默认4KB)的图片自动转为base64内联,减少HTTP请求数量。对于大型项目,可配合rollup-plugin-visualizer分析打包产物体积分布,识别可优化的依赖包。部署阶段建议配置gzip或brotli压缩,配合Nginx的gzip_static指令直接发送预压缩文件,进一步降低传输体积。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/vite-gou-jian-gong-ju-pei-zhi-shi-zhan-cha-jian-ji-zhi-yu/