Vue 项目打包优化:用 webpack-bundle-analyzer 分析包体积并拆分第三方依赖
·
Vue 项目打包优化:使用 webpack-bundle-analyzer 分析包体积并拆分第三方依赖
1. 安装依赖
npm install --save-dev webpack-bundle-analyzer
# 或
yarn add -D webpack-bundle-analyzer
2. 配置 vue.config.js
在项目根目录创建/修改 vue.config.js:
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
configureWebpack: {
plugins: [
new BundleAnalyzerPlugin({
analyzerMode: 'server', // 启动HTTP服务器展示报告
analyzerHost: '127.0.0.1', // 主机地址
analyzerPort: 8888, // 端口号
openAnalyzer: true, // 完成后自动打开浏览器
reportFilename: 'report.html', // 报告文件名
defaultSizes: 'parsed', // 显示解析后的大小
})
],
optimization: {
splitChunks: {
chunks: 'all',
minSize: 20000, // 最小拆分包大小(20KB)
maxSize: 250000, // 最大拆分包大小(250KB)
cacheGroups: {
// 拆分第三方依赖
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
priority: -10,
},
// 拆分常用工具库
utils: {
test: /[\\/]src[\\/]utils[\\/]/,
name: 'utils',
minChunks: 1,
priority: -20
}
}
}
}
}
}
3. 运行分析报告
npm run build --report
# 或
vue-cli-service build --report
构建完成后会自动打开 http://127.0.0.1:8888 显示可视化分析图:
(图中不同颜色区块代表不同模块的体积占比)
4. 优化策略(基于分析结果)
(1) 按需加载第三方库
// 错误示例:全量引入 lodash
import _ from 'lodash';
// 正确示例:按需引入
import debounce from 'lodash/debounce';
(2) CDN 引入大型库
在 vue.config.js 添加:
module.exports = {
chainWebpack: config => {
config.externals({
vue: 'Vue',
'vue-router': 'VueRouter',
axios: 'axios'
});
}
}
在 public/index.html 中引入CDN:
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js"></script>
</head>
(3) 异步加载路由组件
// router.js
const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue');
const About = () => import(/* webpackChunkName: "about" */ './views/About.vue');
5. 验证优化效果
重新构建后对比:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 总包大小 | 3.2MB | 1.4MB |
| 首屏加载时间 | 2.8s | 1.1s |
| 第三方依赖占比 | 68% | 32% |
关键公式:
首屏加载时间优化率:
$$ \text{优化率} = \frac{T_{\text{before}} - T_{\text{after}}}{T_{\text{before}}} \times 100% $$
6. 注意事项
- 优先处理分析图中 大于 100KB 的模块
- 使用
webpackChunkName规范异步组件命名 - 定期更新 CDN 链接的版本号
- 生产环境关闭分析器:
plugins: process.env.NODE_ENV === 'production'
? []
: [new BundleAnalyzerPlugin()]
通过以上步骤,可显著降低打包体积,提升应用加载性能。建议每次依赖更新后重新分析包结构。
更多推荐
所有评论(0)