Webpack:如何覆盖模块ID?

时间:2016-06-01 09:48:17

标签: webpack versioning

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

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

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

这样做是否安全,或者我们错过了什么,并且有一些webpack功能或插件来处理我们的问题?

1 个答案:

答案 0 :(得分:1)

在Webpack 1.9.x中执行此操作似乎非常安全。 YMMV与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抛弃其默认值路径比较逻辑。您可以使用正则表达式在散列之前替换资源路径的版本组件,以达到预期的效果。