🚀 概述
Vite 7 作为现代前端构建工具,在性能方面有了显著提升,但在大型项目中仍然可能面临构建速度和资源优化的挑战。本文将提供一套全面的 Vite 7 项目构建性能优化方案,帮助开发者提升构建速度、减小产物体积、优化加载性能。
📋 优化前准备
环境检查
# 检查 Node.js 版本
node --version
# Vite 7 要求:
# - Node.js 20.19+ 或 22.12+
# - 不再支持 Node.js 18
依赖检查
# 检查插件兼容性
npm outdated
# 更新核心插件
npm install vite@^7.0.0
# 更新常用插件
npm install @vitejs/plugin-react@^4.0.0 # React 项目
npm install @vitejs/plugin-vue@^5.0.0 # Vue 项目
🔥 核心优化策略
1. 使用 Rolldown 替代 Rollup
Vite 7 引入了基于 Rust 的高性能打包器 Rolldown,可显著提升构建速度。
// package.json - 使用 Rolldown
{
"dependencies": {
"vite": "npm:rolldown-vite@latest"
}
}
// 或使用 overrides
{
"overrides": {
"vite": "npm:rolldown-vite@latest"
}
}
2. 优化构建目标
Vite 7 默认构建目标已更新为 baseline-widely-available
,提供更好的浏览器兼容性和性能平衡。
// vite.config.js
export default {
build: {
// 使用新默认值
target: "baseline-widely-available",
// 或针对特定浏览器优化
// target: ["chrome107", "firefox104", "safari16"],
},
};
3. 启用高级代码分割
使用 Rolldown 的 advancedChunks
API 替代传统的 manualChunks
,实现更精细的代码分割控制。
// vite.config.js
export default {
build: {
rollupOptions: {
output: {
// 高级代码分割配置
advancedChunks: {
groups: [
{
name: "vendor",
test: /\/node_modules\/(?!lodash|axios)/, // 排除某些库
priority: 10,
},
{
name: "react-vendor",
test: /\/node_modules\/react(-dom)?/,
priority: 20, // 优先级更高
},
{
name: "utils",
test: /\/src\/utils/,
priority: 5,
},
{
name: "components",
test: /\/src\/components/,
priority: 5,
},
],
},
},
},
},
};
4. 优化插件性能
使用 withFilter
API 包装插件,减少不必要的插件调用,降低构建开销。
import { withFilter, defineConfig } from "vite";
import svgr from "vite-plugin-svgr";
import vue from "@vitejs/plugin-vue";
export default defineConfig({
plugins: [
// 使用 withFilter 包装插件
withFilter(
svgr({
// SVG 插件配置
}),
{
load: { id: /\.svg\?react$/ },
transform: { id: /\.svg$/ },
}
),
// Vue 插件也可以使用 withFilter
withFilter(
vue(),
{
transform: { id: /\.vue$/ },
}
),
],
});
5. 启用原生插件支持
开启实验性的原生插件支持,进一步提升构建性能。
// vite.config.js
export default {
experimental: {
enableNativePlugin: true,
},
};
6. 使用 Oxc 替代 esbuild
尝试使用 Oxc 进行代码转换,提供更好的性能。
// vite.config.js
export default {
experimental: {
transformWithOxc: true,
},
};
🛠️ 多环境构建优化
1. 使用 Environment API
利用 Vite 7 的 Environment API 实现多环境构建,优化不同环境的构建配置。
// vite.config.js
import { defineConfig } from "vite";
export default defineConfig({
environments: {
// 客户端环境
client: {
build: {
outDir: "dist/client",
rollupOptions: {
input: "src/entry-client.js",
output: {
manualChunks: {
vendor: ["vue", "vue-router"],
},
},
},
},
},
// 服务端环境
server: {
build: {
outDir: "dist/server",
ssr: true,
rollupOptions: {
input: "src/entry-server.js",
// 服务端构建通常不需要代码分割
},
},
},
},
plugins: [
{
name: "build-coordinator",
buildApp: async (builder) => {
// 先构建客户端,再构建服务端
await builder.build(builder.environments.client);
await builder.build(builder.environments.server);
},
},
],
});
2. 并行构建
对于复杂项目,可以实现并行构建以提升构建速度。
// vite.config.js - 并行构建示例
export default defineConfig({
// 环境配置...
plugins: [
{
name: "parallel-build",
buildApp: async (builder) => {
// 获取所有环境
const environments = Object.values(builder.environments);
// 并行构建所有环境
return Promise.all(environments.map((env) => builder.build(env)));
},
},
],
});
📦 资源优化策略
1. 静态资源处理
优化静态资源处理,减小构建产物体积。
// vite.config.js
export default {
build: {
// 配置静态资源处理
assetsInlineLimit: 4096, // 4kb 以下的资源内联为 base64
cssCodeSplit: true, // CSS 代码分割
sourcemap: false, // 生产环境关闭 sourcemap
// 自定义静态资源输出目录
assetsDir: "static",
// 启用 gzip 压缩
reportCompressedSize: true,
},
};
2. 图片优化
使用 vite-plugin-imagemin 优化图片资源。
// vite.config.js
import { defineConfig } from "vite";
import viteImagemin from "vite-plugin-imagemin";
export default defineConfig({
plugins: [
viteImagemin({
gifsicle: {
optimizationLevel: 7,
interlaced: false,
},
optipng: {
optimizationLevel: 7,
},
mozjpeg: {
quality: 80,
},
pngquant: {
quality: [0.8, 0.9],
speed: 4,
},
svgo: {
plugins: [
{
name: "removeViewBox",
},
{
name: "removeEmptyAttrs",
active: false,
},
],
},
}),
],
});
3. SVG 图标优化
使用 vite-plugin-svg-icons 优化 SVG 图标管理。
// vite.config.js
import { defineConfig } from "vite";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import path from "path";
export default defineConfig({
plugins: [
createSvgIconsPlugin({
// 指定需要缓存的图标文件夹
iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],
// 指定symbolId格式
symbolId: "icon-[dir]-[name]",
// 是否优化svg
svgoOptions: true,
}),
],
});
🚄 开发体验优化
1. 开发服务器配置
优化开发服务器配置,提升开发体验。
// vite.config.js
export default {
server: {
// 热更新优化
hmr: {
overlay: false, // 禁用错误覆盖层
},
// 文件系统优化
fs: {
strict: false, // 允许访问工作区以外的文件
allow: ["../**"], // 允许访问上级目录
},
// 启用压缩
compress: true,
// 预构建优化
optimizeDeps: {
force: false, // 仅在需要时强制重新构建
},
},
};
2. 缓存优化
配置缓存策略,提升构建速度。
// vite.config.js
export default {
cacheDir: "node_modules/.vite", // 自定义缓存目录
// 依赖优化选项
optimizeDeps: {
// 强制预构建这些依赖
include: ["vue", "vue-router", "pinia"],
// 排除不需要预构建的依赖
exclude: ["@vueuse/core"],
},
};
🔍 性能分析与监控
1. 构建分析
使用 rollup-plugin-visualizer 分析构建产物。
// vite.config.js
import { defineConfig } from "vite";
import { visualizer } from "rollup-plugin-visualizer";
export default defineConfig({
plugins: [
visualizer({
open: true, // 自动打开分析报告
filename: "dist/stats.html", // 分析报告输出路径
gzipSize: true, // 显示 gzip 大小
brotliSize: true, // 显示 brotli 大小
}),
],
});
2. 性能调试
添加性能调试配置,帮助诊断构建问题。
// vite.config.js
export default defineConfig({
build: {
// 启用构建性能分析
reportCompressedSize: true,
chunkSizeWarningLimit: 500, // 调整警告阈值
// 调试代码分割
rollupOptions: {
output: {
manualChunks(id) {
console.log("Chunk ID:", id);
// 根据输出调整分包策略
if (id.includes("node_modules")) {
return "vendor";
}
},
},
},
},
// 日志级别
logLevel: "info", // 可选: "info", "warn", "error", "silent"
});
⚠️ 常见问题与解决方案
1. 构建目标警告
问题:看到关于 build.target
的警告
Warning: build.target 'modules' is deprecated
解决方案:
// vite.config.js
export default {
build: {
target: "baseline-widely-available", // 使用新默认值
},
};
2. 插件兼容性问题
问题:某些插件可能与 Vite 7 不兼容
解决方案:
# 检查插件更新
npm outdated
# 更新到兼容版本
npm update
# 或寻找替代插件
3. Rolldown 选项验证
问题:Rolldown 可能不支持某些 Rollup 选项
解决方案:
// vite.config.js
import { rolldownVersion } from 'vite';
export default {
build: {
rollupOptions: {
output: rolldownVersion ? {
// Rolldown 特定配置
advancedChunks: {
// ...
}
} : {
// Rollup 特定配置
manualChunks: {
// ...
}
}
}
}
};
4. 依赖冲突解决
问题:依赖版本冲突导致构建失败
解决方案:
# 清理依赖
rm -rf node_modules package-lock.json
npm install
# 检查依赖树
npm ls vite
# 解决版本冲突
npm install --force
📈 性能优化最佳实践
完整优化配置示例
// vite.config.js - 综合优化配置
import { defineConfig, withFilter } from "vite";
import vue from "@vitejs/plugin-vue";
import { visualizer } from "rollup-plugin-visualizer";
import viteImagemin from "vite-plugin-imagemin";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import path from "path";
export default defineConfig({
// 基础配置
base: "/",
cacheDir: "node_modules/.vite",
// 构建优化
build: {
target: "baseline-widely-available",
minify: "terser", // 使用 terser 进行更彻底的压缩
terserOptions: {
compress: {
drop_console: true, // 移除 console
drop_debugger: true, // 移除 debugger
},
},
cssCodeSplit: true,
assetsInlineLimit: 4096,
chunkSizeWarningLimit: 500,
sourcemap: false,
// Rolldown/Rollup 配置
rollupOptions: {
output: {
// 使用 Rolldown 的高级分包
advancedChunks: {
groups: [
{ name: "vendor", test: /node_modules/, priority: 10 },
{ name: "vue", test: /node_modules\/vue/, priority: 20 },
{ name: "components", test: /src\/components/, priority: 5 },
{ name: "views", test: /src\/views/, priority: 5 },
{ name: "assets", test: /\.(css|less|scss)$/, priority: 5 },
],
},
// 自定义文件名格式
entryFileNames: "assets/[name].[hash].js",
chunkFileNames: "assets/[name].[hash].js",
assetFileNames: "assets/[name].[hash].[ext]",
},
},
},
// 开发服务器优化
server: {
hmr: { overlay: false },
fs: { strict: false },
host: true,
port: 3000,
open: true,
},
// 依赖优化
optimizeDeps: {
include: ["vue", "vue-router", "pinia"],
exclude: [],
},
// 实验性功能
experimental: {
enableNativePlugin: true,
transformWithOxc: true,
},
// 插件配置
plugins: [
// Vue 插件
withFilter(
vue(),
{ transform: { id: /\.vue$/ } }
),
// SVG 图标插件
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],
symbolId: "icon-[dir]-[name]",
svgoOptions: true,
}),
// 图片压缩插件
viteImagemin({
gifsicle: { optimizationLevel: 7 },
optipng: { optimizationLevel: 7 },
mozjpeg: { quality: 80 },
pngquant: { quality: [0.8, 0.9], speed: 4 },
svgo: { plugins: [{ name: "removeViewBox" }] },
}),
// 构建分析插件
visualizer({
open: true,
filename: "dist/stats.html",
gzipSize: true,
brotliSize: true,
}),
],
});
🏆 总结
Vite 7 提供了多种性能优化的可能性,通过合理配置可以显著提升构建速度和产物质量。主要优化方向包括:
- 使用 Rolldown:替代传统 Rollup,获得更快的构建速度
- 优化代码分割:使用 advancedChunks 实现精细的代码分割
- 插件性能优化:使用 withFilter 减少不必要的插件调用
- 多环境构建:利用 Environment API 优化多环境构建流程
- 资源优化:优化静态资源、图片和 SVG 图标
- 缓存策略:合理配置缓存提升构建速度
通过综合应用这些优化策略,可以为 Vite 7 项目带来显著的性能提升,提高开发效率和用户体验。