思路:从 模块搜索时间、解析时间、压缩时间、二次打包时间 入手
// 把它放置在其它 loader 之前
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: ['thread-loader', 'babel-loader'],
},
],
},
};
thread-loader 需要放在 style-loader 之后:因为 thread-loader 后的 loader 没法存取文件也没法获取 webpack 的选项设置
使用缓存后,node_modules 中会有一个.cache 目录,用于存放缓存内容
cache-loader:只对性能开销较大的 loader 使用,保存和读取缓存文件有开销
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: ['cache-loader', 'babel-loader'],
},
],
},
};
babel-loader 开启缓存,在 babel-loader 后面加上?cacheDirectory=true
hard-source-webpack-plugin:用于开启模块的缓存
terser-webpack-plugin 开启缓存
将第三方库代码和业务代码都打包进一个 bundle,那么处理这个 bundle 文件的插件(比如压缩之类的插件),就没办法不处理里面第三方库内容
第三方库代码基本都是成熟的,不用作处理,可以将第三方库代码分离出来
配置 externals,每一个库都在 html 文档中引入一个 script 标签,js 文件下载影响性能,而且我们只使用库中的部分功能,script 标签全量引入不合理
SplitChunks 在每一次构建会重新构建第三方库,不能有效提升构建速度
使用 DllPlugin 和 DLLReferencePlugin(配合使用,webpack 内置插件),会将不频繁更新的第三方库单独打包,当这些第三方库版本没有变化时,不需要重新构建
// webpack.dll.js 用于打包第三方库
const path = require('path');
const webpack = require('webpack');
module.exports = {
mode: 'production',
entry: {
three: ['jquery', 'lodash'], // 第三方库配置
},
output: {
filename: '[name].dll.js', // [name] 就是在 entry
path: path.resolve(__dirname, 'dist/lib'),
library: '[name]',
},
plugins: [
new webpack.DllPlugin({
name: '[name]',
path: path.resolve(__dirname, 'dist/lib/[name].json'), // manifest.json 的存放位置
}),
],
};
module.exports = {
plugins: [
// 修改 CleanWebpackPlugin 配置
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns: [
'!lib/**', // 在每次清除 dist 目录时,不清理 lib 文件夹
],
}),
// dll 相关配置
new webpack.DllReferencePlugin({
// 将 manifest 字段配置成第1步中打包出来的 json 文件
manifest: require('./dist/lib/three.json'),
}),
],
};
分离第三方库和业务代码中的基础库,通过 SplitChunks 或动态链接库
mode:production 自动开启
uglifyjs-webpack-plugin(废弃) 和 terser-webpack-plugin(推荐)
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [
new TerserPlugin({
parallel: true, // 开启并行压缩,加快构建速度
sourceMap: true, // 使用 source-maps
}),
],
},
};
terser 是什么:用于 ES6+ 的 JavaScript 解析器、mangler/compressor(压缩器)工具包。
gzip
compression-webpack-plugin
const CompressionWebpackPlugin = require('compression-webpack-plugin');
module.exports = {
plugins: [
new CompressionWebpackPlugin({
test: /\.(js|css)$/, // 匹配要压缩的文件
algorithm: 'gzip',
}),
],
};