Webpack打包小优化

818 阅读2分钟

有一天,收到了一个项目。执行npm run build打包测试了一下,总耗时上,首次打包45028ms,二次打包32344ms。内心是崩溃的。想着每执行一次打包,都得多浪费一点shengming,于是只好优化一下。

一、webpack-bundle-analyzer并不很耗时

看了下webpack配置文件,其中使用了webpack-bundle-analyzer这个插件,它不仅会分析打包文件的模块构成占比,而且会启动一个浏览器页面(如下图),怀疑它可能是比较耗时的,于是将其注释掉。

然后,再次执行打包。得到首次打包耗时46627ms,二次打包耗时31127ms。看来,并没有什么用。

二、移除speed-measure-webpack-plugin初见成效

又看到打包流程中有个speed-measure-webpack-plugin,这个需要持续不断地往控制台更新进度,于是把它注释掉。再次执行打包,得到首次打包耗时37290ms,二次打包耗时23843ms。OK,降下去大几秒,初见成效。

三、hard-source-webpack-plugin与cache-loader搭配使用有奇效

再采用hard-source-webpack-plugin来试一下,于是在webpack.prod.config.js上的plugins中添加了: new HardSourceWebpackPlugin(),

这时,首次打包46186ms,二次打包36192ms。看着没什么效果。二次打包的时候,还老是时不时的报个错:

hashing(node:142152) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be one of type string, TypedArray, or DataView.

于是想到给所有的资源加个ts\tsx\sass\scss\less\css资源加个cache-loader。加完之后,首次打包22678ms,二次打包8812ms。有奇效!而且,上面hard-source-webpack-plugin带来的那个报错也消失了。

看来,hard-source-webpack-plugin与cache-loader之间应该存在某种联系,于是,决定把hard-source-webpack-plugin移除。移除hard-source-webpack-plugin之后,发现首次打包时间退回到了31266ms,二次打包是18025ms。看来,这个hard-source-webpack-plugin不是没用,而是要跟cache-loader一起用。

因为项目的目录下有个server目录,里面有很多文件,实际上是不需要构建的,所以我们尝试缩小模块搜索的范围。于是在resolve配置项下添加: modules: ['node_modules', path.resolve(__dirname, 'src')],

首次打包变成24807ms,二次打包变成8999ms。并没什么用。

看来,实际情况和想象还是很可能不一样,实践出真知。

四、TerserPlugin的comment相关配置对打包后文件大小有显著影响

添加如下配置之后:

new TerserPlugin({
  parallel: true,
  terserOptions: {
    format: {
      comments: false,
    },
  },
  extractComments: false,
}),

打包后资源大小从26,334,098 字节之后变成10,853,505 字节,变化非常明显。