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
,我需要自己实现它的默认路径比较逻辑。您可能会在散列之前使用正则表达式替换资源路径的版本组件,以达到预期效果。
问题: 我们将 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
,我需要自己实现它的默认路径比较逻辑。您可能会在散列之前使用正则表达式替换资源路径的版本组件,以达到预期效果。