Webpack 5 供应商代码块命名

10
在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}`;
    },
  },
},
1个回答

6

对于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, "-");
}

主要问题是拆分出来的块的命名。目前的文档没有很明确地说明这一点,但在config.optimization.splitChunks中配置的cacheGroup设置,如果没有特定的cacheGroup,则适用于所有cacheGroups。
我还启用了对块、资源名称和提取的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"
      }),
    ],
  };
};

这导致文件名超过限制,因此在输出文件夹中得到了更短、更简洁的文件名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接