

configureServer、transformIndexHtml、handleHotUpdatename 唯一、apply 指定运行阶段('serve' | 'build' | 'client' | 'server')enforce: 'pre' | 'post' 控制钩子前后顺序示例:注入构建 banner + 开发阶段虚拟模块
// vite-plugin-banner.ts
import type { Plugin } from 'vite'
export default function bannerPlugin(text = 'Built with Vite'): Plugin {
return {
name: 'vite-plugin-banner',
apply: 'build',
generateBundle(_, bundle) {
for (const f of Object.values(bundle)) {
if (f.type === 'chunk') f.code = `/* ${text} */\n` + f.code
}
}
}
}
// vite-plugin-virtual.ts
import type { Plugin } from 'vite'
const ID = 'virtual:env'
export default function virtualEnvPlugin(): Plugin {
return {
name: 'vite-plugin-virtual-env',
resolveId(id) { return id === ID ? id : null },
load(id) { if (id === ID) return `export const mode = '${process.env.NODE_ENV}'` },
handleHotUpdate(ctx) {
if (ctx.file.includes('.env')) ctx.server.ws.send({ type: 'full-reload' })
}
}
}示例:注入 HTML 资源提示
// vite-plugin-preload.ts
import type { Plugin } from 'vite'
export function preloadPlugin(): Plugin {
return {
name: 'vite-plugin-preload',
transformIndexHtml(html) {
const hint = `<link rel="preconnect" href="https://cdn.example.com">`
return html.replace('</head>', `${hint}</head>`)
}
}
}configureServer 注入中间件,或调用 server.ws.send 实现自定义热更新// vite-plugin-middleware.ts
import type { Plugin } from 'vite'
export function middlewarePlugin(): Plugin {
return {
name: 'vite-plugin-middleware',
apply: 'serve',
configureServer(server) {
server.middlewares.use('/health', (_req, res) => { res.statusCode = 200; res.end('ok') })
}
}
}() => import('...') 动态导入分离路由包// vue-router
const routes = [ { path: '/', component: () => import('@/pages/Home.vue') } ]const pages = import.meta.glob('/src/pages/**/*.vue', { eager: false })// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default { plugins: [
AutoImport({ imports: ['vue','vue-router','pinia'] }),
Components({ resolvers: [ElementPlusResolver()] })
] }loading="lazy"、大型组件 defineAsyncComponent、非关键脚本 type=module + async/defer// vite.config.ts(Rollup 配置)
import { defineConfig } from 'vite'
export default defineConfig({
build: {
sourcemap: true,
chunkSizeWarningLimit: 800,
rollupOptions: {
output: {
manualChunks: {
framework: ['vue','vue-router','pinia'],
ui: ['element-plus'],
chart: ['echarts']
}
}
}
}
})export default defineConfig({
optimizeDeps: { include: ['lodash-es','dayjs'], exclude: ['big-lib'] }
})export default defineConfig({
base: 'https://cdn.example.com/',
build: { assetsInlineLimit: 8 * 1024 }
})srcsetdefine 注入常量、esbuild 目标(target: 'es2017')减少转译成本ssr.noExternal 控制外部依赖打包;vite-plugin-ssr 或框架内置(Nuxt/Next)实现 SSR/SSGimport { visualizer } from 'rollup-plugin-visualizer'
export default defineConfig({ build: { rollupOptions: { plugins: [visualizer({ filename: 'stats.html' })] } } })vite-plugin-inspect 查看插件链与转换结果import Inspect from 'vite-plugin-inspect'
export default defineConfig({ plugins: [Inspect()] })export default defineConfig({
server: {
proxy: {
'/api': { target: 'https://api.example.com', changeOrigin: true, rewrite: p => p.replace(/^\/api/, '') }
}
}
})CI=true vite build --mode production 固化生产模式;在 CI 缓存 node_modules 与 .vite 目录pnpm i --frozen-lockfile 与构建日志采集,形成度量闭环optimizeDeps.include/exclude 精确控制;避免同时引入 CJS/ESM 导致重复enforce 配置不当导致转换顺序错误;通过 vite-plugin-inspect 排查base 与静态资源路径需一致;部署端正确配置缓存与回源import() 与 import.meta.globunplugin-auto-import 与组件按需 unplugin-vue-componentsmanualChunksoptimizeDeps 的 include/exclude 管理base、assetsInlineLimitfont-display: swapdefine 与 esbuild 目标ssr.noExternal 与 Streamingserver.proxy 与中间件import type { Plugin } from 'vite'
export function rewritePlugin(): Plugin {
return {
name: 'vite-plugin-rewrite',
enforce: 'pre',
transform(code, id) {
if (id.endsWith('.ts') || id.endsWith('.js')) return code.replace(/@\//g, '/src/')
}
}
}import { defineConfig } from 'vite'
export default defineConfig({
optimizeDeps: {
entries: ['src/main.ts'],
include: ['lodash-es','dayjs'],
esbuildOptions: { target: 'es2017' }
}
})export default defineConfig({ build: { modulePreload: { polyfill: true } } })CI=true vite build --mode production --profileexport default defineConfig({ server: { fs: { strict: true }, hmr: { overlay: true } } })enforce 并使用 vite-plugin-inspect 观察链路optimizeDeps.exclude 排除并统一使用 ESM 入口build.assetsInlineLimit 与输出哈希策略