性能优化
一、认识
Webpack
性能优化手段主要有 并行编译、缓存、缩小资源搜索范围 等等, 从而实现极致的性能优化。
二、持久化缓存
2.1 Webpack5 cache
持久化缓存 算得上是 Webpack 5
最令人振奋的特性之一。它能够将首次构建的过程与结果数据持久化保存到本地文件系,在下次编译时对比每一个文件的内容哈希或时间戳,未发生变化的文件跳过编译操作,直接使用缓存副本,减少重复计算, 发生变 更的模块则重新执行编译流程。需要在 Webpack5
中设置 cache.type = 'filesystem'
即可开启。
module.exports = {
//...
cache: {
type: 'filesystem'
},
//...
};
此外,cache
还提供了若干用于配置缓存效果、缓存周期的配置项,包括:
cache.type
: 缓存类型,支持 'memory' | 'filesystem'
,需要设置为 filesystem
才能开启持久缓存
cache.cacheDirectory
: 缓存文件路径,默认为 node_modules/.cache/webpack
cache.buildDependencies
: 额外的依赖文件,当这些文件内容发生变化时,缓存会完全失效而执行完整的编译构建,通常可设置为各种配置文件,如:
module.exports = {
cache: {
type: 'filesystem',
buildDependencies: {
config: [
path.join(__dirname, 'webpack.dll_config.js'),
path.join(__dirname, '.babelrc')
],
},
},
};
cache.managedPaths
: 受控目录,Webpack
构建时会跳过新旧代码哈希值与时间戳的对比,直接使用缓存副本,默认值为 ['./node_modules']
;
cache.profile
: 是否输出缓存处理过程的详细日志,默认为 false
cache.maxAge
: 缓存失效时间,默认值为 5184000000
。
2.2 Webpack4 cache-loader
Webpack5
的持久化缓存用法简单,效果出众,但可惜在 Webpack4
及之前版本原生还没有相关实现,只能借助一些第三方组件实现类似效果,包括:
-
使用
cache-loader
-
使用
hard-source-webpack-plugin
-
使用
Loader
(如babel-loader
、eslint-loader
)自带的缓存能力
cache-loader
: 能够将 Loader
处理结果保存到硬盘,下次运行时若文件内容没有发生变化则直接返回缓存结果。由于 cache-loader
只缓存了 Loader
执行结果,缓存范围与精度不如 Webpack5
内置的缓存功能,所以性能效果相对较低。用法如下:
1. 安装依赖
yarn add -D cache
2. 修改配置,注 意必须将 cache-loader
放在 loader
数组首位,例如:
module.exports = {
// ...
module: {
rules: [{
test: /\.js$/,
use: ['cache-loader', 'babel-loader', 'eslint-loader']
}]
},
// ...
};
2.3 Webpack4 hard-source-webpack-plugin
hard-source-webpack-plugin
也是一种实现缓存功能的第三方组件,与 cache-loader
不同的是,它并不仅仅缓存了 Loader
运行结果,还保存了 Webpack
构建过程中许多中间数据,包括: 模块、模块关系、模块 Resolve
结果、Chunks
、Assets
等,效果几乎与 Webpack5
自带的 Cache
对齐。
1. 安装依赖
yarn add -D hard-source-webpack-plugin
2. 添加配置
const HardSourceWebpackPlugin = require("hard-source-webpack-plugin");
module.exports = {
// ...
plugins: [
new HardSourceWebpackPlugin(),
],
};
2.4 Webpack4 babel-loader 自带缓存
使用 babel-loader
时,只需设置 cacheDirectory = true
即可开启缓存功能,例如:
module.exports = {
// ...
module: {
rules: [{
test: /\.m?js$/,
loader: 'babel-loader',
options: {
cacheDirectory: true,
},
}]
},
// ...
};
2.5 Webpack4 eslint-webpack-plugin 自带缓存
ESLint
这一类耗时较长的 Lint
工具也贴心地提供了相应的缓存能力,只需设置 cache = tru
e 即可开启,如
// webpack.config.js
module.exports = {
plugins: [
new ESLintPlugin({ cache: true }),
],
};
2.6 Webpack4 stylelint-webpack-plugin 自带缓存
Stylelint
这一类耗时较长的 Lint
工具也贴心地提供了相 应的缓存能力,只需设置 cache = true
即可开启
// webpack.config.js
module.exports = {
plugins: [
new StylelintPlugin({ files: '**/*.css', cache: true }),
],
};