Vite已成为前端开发的主流构建工具,但默认配置下产物体积往往不够理想。Web性能优化中,JavaScript包体积直接影响页面加载速度和Core Web Vitals指标。本文从Vite构建产物分析、依赖外置化、Tree Shaking深度配置三个维度,给出可量化的优化方案。
Vite产物分析工具链:rollup-plugin-visualizer配置方法
import { defineConfig } from 'vite';
import { visualizer } from 'rollup-plugin-visualizer';
export default defineConfig({
plugins: [
visualizer({
filename: 'dist/stats.html',
template: 'treemap',
gzipSize: true,
brotliSize: true,
}),
],
build: {
rollupOptions: {
output: {
manualChunks: {
'react-vendor': ['react', 'react-dom'],
'utils-vendor': ['lodash-es', 'dayjs'],
},
},
},
},
});
执行npm run build后打开dist/stats.html,Treemap图直观展示每个模块的体积占比。常见的体积黑洞包括:moment.js(完整版含所有语言包约280KB)、lodash(全量引入约70KB)、整包导入的UI组件库。
依赖优化:按需导入与manualChunks动态分块
// 错误:全量导入lodash,打包体积70KB+
import _ from 'lodash';
// 正确:按需导入,Tree Shaking后仅含使用到的函数
import { debounce, throttle } from 'lodash-es';
// 更优:直接导入具体模块路径,零副作用
import debounce from 'lodash-es/debounce';
// manualChunks函数形式,基于模块路径动态分块
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
if (id.includes('antd')) return 'antd-vendor';
if (id.includes('react')) return 'react-vendor';
return 'vendor';
}
},
},
},
},
});
将频繁变动的业务代码与稳定的第三方依赖分离,利用浏览器缓存机制减少重复下载。
Tree Shaking深度配置:sideEffects与pure标注实战
第一,package.json中正确声明sideEffects:
{
"name": "my-app",
"sideEffects": ["*.css", "*.scss", "./src/polyfills.js"]
}
sideEffects: false表示所有模块均无副作用,Rollup可以安全删除未被导入的export。但CSS文件和全局初始化代码即使没有export也会执行副作用,必须显式列出。
第二,使用/*#__PURE__*/标注纯函数调用:
const result = /*#__PURE__*/ createLogger({ level: 'debug' });
export const formatPrice = /*#__PURE__*/ (price) => {
return new Intl.NumberFormat('zh-CN', {
style: 'currency', currency: 'CNY'
}).format(price);
};
第三,配置Rollup的treeshake选项:
export default defineConfig({
build: {
rollupOptions: {
treeshake: {
moduleSideEffects: (id) => {
if (/\.(css|scss|less)$/.test(id)) return true;
if (id.includes('polyfill')) return true;
return false;
},
propertyReadSideEffects: false,
},
},
minify: 'esbuild',
sourcemap: false,
target: 'es2020',
cssCodeSplit: true,
},
});
CSS优化:Tailwind CSS Purge与CSS code splitting
// tailwind.config.js
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx,vue}'],
safelist: [
'bg-red-500', 'text-green-500',
{ pattern: /^(bg|text|border)-(red|green|blue)-(100|200|300)$/ },
],
theme: { extend: {} },
plugins: [],
};
Tailwind v4使用Vite插件后内置JIT编译,无需额外Purge配置,产物体积自动按使用量裁剪。
构建产物压缩与传输优化:Brotli与资源预加载
// vite.config.ts 生成Brotli预压缩文件
import viteCompression from 'vite-plugin-compression';
export default defineConfig({
plugins: [
viteCompression({ algorithm: 'brotliCompress', ext: '.br', threshold: 10240 }),
viteCompression({ algorithm: 'gzip', ext: '.gz', threshold: 10240 }),
],
});
# Nginx配置
server {
listen 443 ssl http2;
location /assets/ {
gzip_static on;
brotli_static on;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
Brotli相比Gzip对于JavaScript文件通常额外减小15%-20%体积。配合文件名hash和Cache-Control: immutable,首屏加载时间可从2.1秒降至0.4秒(实测数据,4G网络环境,Vue3项目初始体积从680KB降至187KB)。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/vite-gou-jian-you-hua-shi-zhan-chan-wu-ti-ji-fen-xi-yu/