Webpack
中文:
SplitChunksPlugin | webpack 中文文档
上一节中我们异步加载lodash
文件后产出的文件是0.js
,我们如何让lodash
产出的文件就是lodash
名呢?
可以在异步加载的时候加上如下注释:
function getComponent() {
// 命名为 lodash
return import(/* webpackChunkName: "lodash" */ "lodash").then(
({ default: _ }) => {
console.log(_.join(["a", "b", "c"], "--"));
}
);
}
getComponent();
这样打包出来的文件就会进行命名啦。
optimization.splitChunks
这是 splitChunks 的默认配置参数,当我们设置 splitChunks:{} 的时候,splitChunks 就会执行默认的配置
// ...
module.exports = {
// ...
// optimization表示打包优化
optimization: {
// 导出的模块被使用才会进行打包
usedExports: true,
// 代码分割的配置
splitChunks: {
// 分割引入代码库的方式,默认为 async 异步,可选 all 同步和异步都进行分割
chunks: 'all',
// 如果引入的包大于20000字节就进行分割
minSize: 20000,
minRemainingSize: 0,
maxSize: 0,
// 表示包最少被使用 1 次
minChunks: 1,
maxAsyncRequests: 30,
maxInitialRequests: 30,
enforceSizeThreshold: 50000,
// 代码分割的名字由 cacheGroups 对象决定
// 打包同步代码的时候,通过 splitChunks 进行分割,webpack 就会走 cacheGroups 的配置,这样可以更加精确的控制文件名
cacheGroups: {
// 检查同步的模块来自于哪里,如果是 node_module ,lodash 就会分配到 testName 的名字
defaultVendors: {
// 模块来自于 node_modules,名字就会拼接 vendors 前缀,例如 lodash
test: /[\\/]node_modules[\\/]/,
// 匹配优先级,默认为0
priority: -10,
// 如果一个模块被打包过就不再进行打包
reuseExistingChunk: true,
// lodash 是在哪里被引入的,如果是 index.js 打包后也就是 main.js,所以 lodash 会被命名为 vendor~lodash
// 可以通过 filename 对文件进行命名
filename: "testName.js"
},
// default 是一个兜底的组,如果不满足上面的条件就会分配到 default 里面
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true,
filename: "common.js"
},
},
},
}
}
因为我们在src/index.js
配置了lodash
的产出名所以文件命名为lodash
,而不是0.js
,testName.js
是根据cacheGroups
条件产出的文件名,而不是之前的vendor~main.js
。