如何监控 Webpack 构建体积变化?
最近项目构建后 bundle 体积涨得有点快,想加个监控看看每次构建的大小变化,但不知道怎么搞。试过用 webpack-bundle-analyzer 手动生成报告,但没法自动追踪历史记录。
有没有办法在 CI 里自动记录每次构建的 chunk 大小,甚至设置阈值告警?比如超过 2MB 就报错之类的。
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
plugins: [
new BundleAnalyzerPlugin({
analyzerMode: 'static',
openAnalyzer: false,
reportFilename: 'report.html'
})
]
};
先说最简单的方案:用
webpack-bundle-stats插件,它会生成一个stats.json文件,里面包含每个 chunk 的精确体积,比webpack-bundle-analyzer更适合自动化。安装:
npm install --save-dev webpack-bundle-stats配置里加:
构建完会生成
build-stats.json,里面每个 entry 和 chunk 的 gzip 和 brotli 压缩后大小都有,结构大概是:{ "entries": { "main": { "size": 1234567, "sizeGzip": 456789 } } }然后 CI 里加个脚本,比如用 Node 写个简单的检查脚本
check-size.js:CI 里跑完构建再执行
node check-size.js就行,超了直接退出非 0,构建就挂了。如果想更进一步,比如存历史趋势,可以把每次的 stats 文件用 Git LFS 存着(适合小项目),或者扔进数据库(比如用 Redis 或 SQLite 存每次构建的时间戳和体积),再配合 Grafana 做个简单面板。不过一般小团队用上面那个阈值判断就足够了,真要查问题直接翻 git 历史看 stats 文件变化也行。
补充一句:别光看 uncompressed size,gzip 后可能差好几倍,建议阈值按 gzip 后的来设,
sizeGzip字段就是干这个的。另外提醒下,如果用 Webpack 5,记得把
stats配置成warnings: false, errors: false,否则 stats 文件会很大,解析变慢。