Bundle 分析与优化
分析构建产物体积分布,找出优化点减小产物大小。
安装分析插件
Bash
npm add -D rollup-plugin-visualizer
配置分析插件
JavaScript
import { visualizer } from 'rollup-plugin-visualizer'
export default defineConfig({
plugins: [
visualizer({
filename: 'stats.html', # 输出文件
open: true, # 自动打开
template: 'treemap', # 可视化类型
gzipSize: true # 显示 gzip 体积
})
]
})
可视化类型
| 类型 | 说明 | |
|---|---|---|
| treemap | 树形图,层级展示 | |
| sunburst | 日出图,比例展示 | |
| network | 网络图,依赖关系 |
注意:treemap 最直观展示模块体积分布。
分析产物结构
打开 stats.html 可看到:
- 每个 chunk 的体积
- 模块占 chunk 的比例
- gzip 后的体积
- 模块依赖关系
优化策略
根据分析结果优化:
| 问题 | 优化方案 | |
|---|---|---|
| 大依赖单独打包 | manualChunks | |
| 重复导入 | 提升到公共模块 | |
| 未使用导出 | Tree Shaking | |
| 过大模块 | 按需导入 |
manualChunks 分包
JavaScript
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
// 大依赖单独分包
if (id.includes('lodash')) {
return 'lodash'
}
}
}
}
}
})
按需导入优化
JavaScript
// 全量导入(不推荐)
import _ from 'lodash'
// 按需导入(推荐)
import debounce from 'lodash/debounce'
import throttle from 'lodash/throttle'
Tree Shaking 检查
JavaScript
// 检查是否有副作用标记
// package.json
{
"sideEffects": false
}
gzip 体积对比
| 原始体积 | gzip 体积 | |
|---|---|---|
| 100KB | ~30KB | |
| 500KB | ~150KB | |
| 1MB | ~300KB |
gzip 压缩后体积约为原始的 30%。
要点总结
- visualizer 分析产物体积分布
- treemap 直观展示模块占比
- 针对大依赖配置分包策略
- 按需导入减小产物体积
📝 发现内容有误?点击此处直接编辑