如何在 webpack 联合上下文中向块请求添加参数?
How can I add parameter to chunk requests in the context of webpack federation?
我正在基于 webpack federation 在 Liferay Portal 之上构建模块加载架构。
由于门户网站有登录用户的概念,并且每个用户都有一个首选语言环境,我需要请求 JavaScript 个文件,其中包含一个名为 languageId
的额外参数,该参数等同于语言环境代码(对于例如:en_US
)。这是因为服务器端过滤器根据该参数处理 .js
文件。
查看 webpack 生成的代码,我只能想到两个可以完成此操作的地方:
- https://github.com/webpack/webpack/blob/master/lib/runtime/GetChunkFilenameRuntimeModule.js
- https://github.com/webpack/webpack/blob/master/lib/runtime/LoadScriptRuntimeModule.js
但是,似乎无法配置这两个文件让我将该参数添加到请求中。
另外,我想不出我可以在运行时做任何调整来转换 URL(考虑回调或类似的东西)。
如果有的话,最好的实现方式是什么?
没办法的话,是不是webpack应该有的功能?
提前致谢。
所以,this GitHub issue中给出了解决方案。基本上,我需要做的就是:
- 创建一个与联邦库同名的标准webpack入口点。像这样:
module.exports = {
entry: {
"xyz": ["./initialization-logic"]
},
plugins: [
new ModuleFederationPlugin({
name: "xyz",
// ...
})
]
...
}
- 在该入口点添加此代码:
const original = __webpack_get_script_filename__;
__webpack_get_script_filename__ = (chunkId) => {
const filename = original(chunkId);
return `${filename}?languageId=${lang}`
}
这样,由于 1,代码在浏览器加载库 .js 文件后立即执行。由于 2,标准 __webpack_get_script_filename__
函数被新函数修补,将 languageId
参数添加到请求中。
我正在基于 webpack federation 在 Liferay Portal 之上构建模块加载架构。
由于门户网站有登录用户的概念,并且每个用户都有一个首选语言环境,我需要请求 JavaScript 个文件,其中包含一个名为 languageId
的额外参数,该参数等同于语言环境代码(对于例如:en_US
)。这是因为服务器端过滤器根据该参数处理 .js
文件。
查看 webpack 生成的代码,我只能想到两个可以完成此操作的地方:
- https://github.com/webpack/webpack/blob/master/lib/runtime/GetChunkFilenameRuntimeModule.js
- https://github.com/webpack/webpack/blob/master/lib/runtime/LoadScriptRuntimeModule.js
但是,似乎无法配置这两个文件让我将该参数添加到请求中。
另外,我想不出我可以在运行时做任何调整来转换 URL(考虑回调或类似的东西)。
如果有的话,最好的实现方式是什么?
没办法的话,是不是webpack应该有的功能?
提前致谢。
所以,this GitHub issue中给出了解决方案。基本上,我需要做的就是:
- 创建一个与联邦库同名的标准webpack入口点。像这样:
module.exports = {
entry: {
"xyz": ["./initialization-logic"]
},
plugins: [
new ModuleFederationPlugin({
name: "xyz",
// ...
})
]
...
}
- 在该入口点添加此代码:
const original = __webpack_get_script_filename__;
__webpack_get_script_filename__ = (chunkId) => {
const filename = original(chunkId);
return `${filename}?languageId=${lang}`
}
这样,由于 1,代码在浏览器加载库 .js 文件后立即执行。由于 2,标准 __webpack_get_script_filename__
函数被新函数修补,将 languageId
参数添加到请求中。