5

在 webpack 4 中,供应商块具有诸如 的名称vendors~main~secondary.js,它们指的是与它们相关的块。现在,在 webpack 5 中,供应商块的名称是这样的 : vendors-node_modules_react-dom_index_js.js,这真的不太可读和可理解。

关于如何在使用 webpack 5 时回到 webpack 4 的行为的任何提示?

我想我必须对 做点什么splitChunks.name,但我找不到合适的函数来做到这一点。

编辑

虽然@MrP01 的回答更彻底,并且更深入地了解了 using 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}`;
    },
  },
},
4

1 回答 1

3

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

这导致文件名超出名称限制,在生成的输出文件夹中文件名更短、更简洁。

于 2021-04-10T11:31:25.520 回答