The*_*yne 12 webpack webpack-splitchunks
在 webpack 4 中,供应商块具有诸如 之类的名称vendors~main~secondary.js,这些名称指的是与其相关的块。现在,在 webpack 5 中,供应商块名称是这样的 : vendors-node_modules_react-dom_index_js.js,这确实不太可读和理解。
关于如何在使用 webpack 5 时恢复到 webpack 4 的行为有什么建议吗?
我想我必须做点什么splitChunks.name,但我找不到合适的函数来做到这一点。
编辑
虽然 @MrP01 的答案更彻底,并且对使用提供了更多见解splitChunks.name,但这里有一个我最终使用的简短片段,它允许我回到确切的旧行为。
optimization: {
splitChunks: {
chunks: 'all',
name: (module, chunks, cacheGroupKey) => {
const allChunksNames = chunks.map((chunk) => chunk.name).join('~');
const prefix = cacheGroupKey === 'defaultVendors' ? 'vendors' : cacheGroupKey;
return `${prefix}~${allChunksNames}`;
},
},
},
Run Code Online (Sandbox Code Playgroud)
我对 webpack 5 中的新命名方案有非常相似的感觉。经过大量的努力和测试,我通过将函数句柄传递给属性得出了以下结论filename。
为了获得“更漂亮”的名称(这当然取决于每个人的个人判断),以下函数将名称标准化并删除其中较大且不必要的部分。
function normalizeName(name) {
return name.replace(/node_modules/g, "nodemodules").replace(/[\-_.|]+/g, " ")
.replace(/\b(vendors|nodemodules|js|modules|es)\b/g, "")
.trim().replace(/ +/g, "-");
}
Run Code Online (Sandbox Code Playgroud)
主要问题是分割出来的块的命名。目前的文档对此并不是很明确,但是在 中配置的cacheGroup 设置config.optimization.splitChunks,如果没有特定的cacheGroup,则适用于所有cacheGroup。
我还启用了块、资源名称和提取的 css 的标准化。
module.exports = async () => {
return {
config: {
context: BASE,
entry: entrypoints,
output: {
path: path.resolve(`./.dev/bundles/${locale}`),
publicPath: `/static/bundles/${locale}/`,
filename: (pathData) => {
return normalizeName(pathData.chunk.name) + ".js";
},
chunkFilename: (pathData) => {
return normalizeName(pathData.chunk.id) + ".js";
},
},
devtool: false,
optimization: {
splitChunks: {
chunks: "all",
name(module, chunks, cacheGroupKey) {
const moduleFileName = module.identifier().split("/").reduceRight((item) => item);
// const allChunksNames = chunks.map((item) => item.name).join("-");
return normalizeName(moduleFileName.replace(/[\/]/g, "-"));
}
}
},
},
module: {
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
cssLoader,
postCssLoader
]
},
{
test: /\.(ttf|woff|eot|png|jpg|jpeg|svg)$/,
type: "javascript/auto",
loader: "file-loader",
options: {
name: (resourcePath, resourceQuery) => {
let ext = path.extname(resourcePath); // for instance ".jpg"
return normalizeName(path.basename(resourcePath).slice(0, -ext.length)) + ext;
}
}
}]
},
plugins: [
new MiniCssExtractPlugin({
filename: (pathData) => normalizeName(pathData.chunk.name) + ".css",
chunkFilename: (pathData) => normalizeName(pathData.chunk.id) + ".css"
}),
],
};
};
Run Code Online (Sandbox Code Playgroud)
这导致生成的输出文件夹中的文件名超出了名称限制,成为更短、更简洁的文件名。
| 归档时间: |
|
| 查看次数: |
8852 次 |
| 最近记录: |