Webpack:如何覆盖模块 ID?

Webpack: how to override module ids?

问题: 我们将 SPA 的代码拆分成多个包。每个包都有自己的版本。因此,在产品中,我们希望根据用户的配置使用不同版本的捆绑包。因此,我们需要确保模块 ID 不会在版本之间发生变化(对于同一模块)。

一种可能的解决方案是在配置中定义 recordsPath 并将记录的文件存储在 VC 下。但是当我们更新我们的库时文件总是增长。

另一种选择是覆盖 webpack 在 Compilation.prototype.applyModuleIds 中生成模块 ID 的方式(例如,我们可以使用模块的相对路径作为模块 ID)。

这样做安全吗,或者我们只是错过了一些东西,有一些 webpack 功能或插件可以解决我们的问题?

在 Webpack 1 中执行此操作似乎非常安全9.x。 YMMV with webpack 2,但由于方法的简单性,我不希望如此。

只要你满足同一个模块总是被赋予相同ID的条件,webpack就可以正常运行。我最终使用了以下实现:

var md5 = require('md5');

module.exports = function handleWebpackModuleSymlinks(Compilation) {
  Compilation.prototype.applyModuleIds = function() {
    this.modules.forEach(function(module) {
      if (module.id === null) {
        module.id = md5(module.userRequest);
      }
    }, this);
  };
}

这将根据每个文件的解析绝对路径创建模块哈希,这是开箱即用的行为,但由于在开发过程中使用了符号链接 node_modules,我需要自己实现它的默认路径比较逻辑。您可能会在散列之前使用正则表达式替换资源路径的版本组件,以达到预期效果。