Webpack 优化
体积分析
初级分析
可以通过官方提供的 stat.json 文件帮助我们分析打包结果,stat.json 文件可以通过下面语句快速生成:
webpack --profile --json > stats.json
接着我们通过官网提供的 stats.json 分析工具 进行分析,上传 stats.json 文件之后,就可以得到如下图所示分析结果:
其中包括 webpack 的版本、打包时间、打包过程的 hash 值、模块数量( modules )、chunk 数量、打包生层的静态文件 assets 以及打包的警告和错误数。 我们可以分析其提供的内容,进行大致问题的定位。 第三方工具 webpack-bundle-analyzer 是打包分析神器,它的界面个人觉得很好看,而且能很直观的给出每一个打包出来的文件的大小以及各自的依赖,能够更加方便的帮助我们对项目进行分析。
使用如下:
// config/webpack.common.js
const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");
const commonConfig = {
plugins: [
new BundleAnalyzerPlugin({
analyzerPort: 8889, // 指定端口号
openAnalyzer: false,
}),
],
};
webpack-bundle-analyzer 其底层也是依赖 stat.json 文件的,通过对 stat.json 的分析,得出最后的分析页面 通过分析工具的分析,我们可以知道哪些文件耗时比较多,打包出来的体积比较大,从而对有问题的文件进行优化。
- stat: 每个模块的原始体积
- parsed: 每个模块经 webpack 打包处理之后的体积,比如 terser 等做了压缩,便会体现在上边
- gzip: 经 gzip 压缩后的体积
速度分析
我们可以通过 speed-measure-webpack-plugin 这个插件帮助我们分析整个打包的总耗时,以及每一个 loader 和每一个 plugins 构建所耗费的时间,从而帮助我们快速定位到可以优化 Webpack 的配置。
如上图,耗时比较长的会以红色标出。 使用 引入此插件,创建一个 plugins 实例 smp 包裹 webpack 配置文件即可,我们修改一下 webpack 的公共配置文件 webpack.common.js:
// config/webpack.common.js
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");
const smp = new SpeedMeasurePlugin();
// ...
module.exports = (production) => {
if (production) {
const endProdConfig = merge(commonConfig, prodConfig);
return smp.wrap(endProdConfig);
} else {
const endDevConfig = merge(commonConfig, devConfig);
return smp.wrap(endDevConfig);
}
};
笔者文章演示的代码配置文件分为三个,分别为 开发环境配置文件,生产环境配置文件,以及前二者共用的公共配置文件,如下:
- webpack.dev.js:开发环境使用的配置文件
- webpack.prod.js:生产环境使用的配置文件
- webpack.common.js:公共配置文件 执行打包之后,可以看到如下效果图:
注意:speed-measure-webpack-plugin 对于 webpack 的升级还不够完善,暂时还无法与你自己编写的挂载在 html-webpack-plugin 提供的 hooks 上的自定义 Plugin (add-asset-html-webpack-plugin 就是此类)共存,有人已经在 github 上提了 issue 了,但是貌似还是没有解决。
优化