从零开始的 Webpack4.0 打包速度优化 (篇一)

· 约 7 分钟读完

在前端开发中,Webpack 作为一个主流的模块化打包工具,在项目实践中得到了广泛的应用。然而,在处理大型项目时,随着模块的不断增多,Webpack 的打包速度问题渐渐浮现。这时候,我们就需要花费一些时间去思考和优化打包速度。

本篇文章将从基础的 Webpack 配置出发,详细讲解 Webpack 打包速度优化的各种方法和技巧,并提供示例代码作为参考。

1. 模块解析

在 Webpack 编译过程中,模块解析是其中一个比较耗时的步骤,如果能缩短模块解析时间,就能提高打包速度。

1.1 减少模块查找范围

Webpack 的模块查找范围默认是 node_modules 文件夹,你可以通过配置 resolve.modules 属性来缩小模块查找范围,只查找指定的文件夹。

上例中,Webpack 只会在 src 文件夹和 node_modules 文件夹中查找模块,可以减少不必要的查找。

1.2 缓存模块解析结果

Webpack 在每次编译时会重新处理一遍所有模块,而大部分模块都没有改变。因此,我们可以开启缓存,缓存模块解析的结果,省去不必要的计算。

在 Webpack 4.0 中,开启缓存可以直接配置 cache 属性。

1.3 使用绝对路径

如果使用了相对路径,Webpack 在解析模块时会去拼接模块路径,这会浪费一些时间。建议使用绝对路径。

举个例子,假设我们有一个模块 foo.js 和一个模块 bar.js,在 foo.js 中引入 bar.js:

这里使用了相对路径,在解析 foo.js 时,Webpack 会根据它的相对路径去拼接出 bar.js 的绝对路径,这会耗费一些时间。

使用绝对路径可以避免这样的问题。

2. 插件优化

Webpack 的插件系统在项目打包过程中起到了很大的作用。有一些插件可以优化打包速度。

2.1 使用 HappyPack

HappyPack 是 Webpack 插件,可以在多进程中运行 loader,以减少 loader 占用的时间,优化项目构建时间。

首先,我们需要安装 happypack:

然后,配置 module.rules 中使用 happypack/loader:

2.2 使用 ParallelUglify

UglifyJSPlugin 是 Webpack 官方提供的压缩插件,这个插件使用了单线程模式,如果项目中需要压缩非常多的文件,压缩时间就会非常长。

ParallelUglify 是 Webpack 插件,可以使用多进程模式压缩文件,可以大大缩短压缩时间。首先安装 parallel-uglify-plugin:

然后添加 ParallelUglifyPlugin 插件到配置文件:

上面调用了 ParallelUglifyPlugin,将 uglifyJS 压缩选项传入,实现多进程压缩。

3. chunk 分割优化

Webpack 将所有的模块打包成一个或多个 bundle,这些 bundle 又进一步拆分成小的 chunk。在项目中,chunk 的数量和大小会影响打包速度。

3.1 减少 chunk 数量

通过减少 chunk 数量可以迅速提高打包速度,例如将应用程序和依赖库打包在一起。

上例中,我们使用 optimization.splitChunks 配置将 commons 和 vendor 打包到来减少 chunk 数量,优化打包速度。其中,commons 代表将要拆分出的公共模块,vendor 代表 node_modules 中的模块。

3.2 减小 chunk 体积

如果 chunk 的体积过大,也会影响打包速度。通过减小 chunk 体积,可以提高打包速度。

可以通过减少 chunk 中的元数据来实现减小 chunk 体积。

上例中,开启了 optimization.runtimeChunk 配置后,只会拆分出一个 runtime chunk,减少了其他 chunk 的体积。

结语

本篇文章从模块解析、插件优化和 chunk 分割优化三个方面来讲解了 Webpack 的打包速度优化方法和技巧,如果你在项目打包的过程中遇到了打包速度慢的问题,可以尝试按照上述方法进行优化。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d00016e46428fe9ec6e7db