不幸的是,我对此的复制是在一个复杂的专有项目中,所以我会尽力解释发生了什么。
与我的用例最接近的示例项目是这个:https ://github.com/module-federation/module-federation-examples/tree/master/dynamic-system-host 本质上,我有一个全方位的设置,其中一个Shell App 使用一组远程应用程序。远程应用程序是在运行时发现的,因此没有在 Webpack 配置中指定。
Shell 以及所有 Remote 都依赖于共享库 my-shared-lib:
"dependencies": {
"my-shared-lib": "^1.0.0"
}
Shell 在其 Webpack 配置中将此库公开为一个渴望的单例:
new ModuleFederationPlugin({
name: 'shell',
filename: 'shellDefinition.js',
shared: {
'my-shared-lib': { singleton: true, eager: true, requiredVersion: '^1.0.0' }
},
}),
遥控器在他们的配置中也将其共享,但并不急切:
new ModuleFederationPlugin({
name: 'remoteNameHere',
filename: 'remoteDefinition.js',
exposes: {
'./app': path.join(modulePath, 'app.js'),
},
shared: {
'my-shared-lib': { singleton: true, eager: false, requiredVersion: '^1.0.0' }
},
})
问题是这样的:我已经通过运行时调试和检查 Webpack 生成的包验证了这个库被多次包含和实例化——一次用于 shell,一次用于每个远程。lib 的代码甚至存在于 Webpack 在获取暴露的 ./app.js 时加载的 Remote 的捆绑包中。
我不知道这里发生了什么。我也尝试共享 my-shared-lib 的每一个依赖项,但这无济于事。
我的期望是 Remotes 使用由 Shell 共享的 my-shared-lib 实例,而不是创建自己的实例。
我是否完全误解了依赖共享的工作原理,还是我做错了什么?
应该注意的是,Shell 和 Remots 都有单一的入口点。