Unfortunately, my repro for this is in a complex proprietary project, so I will do my best to explain what is going on.
The closest example project to my use-case is this one: https://github.com/module-federation/module-federation-examples/tree/master/dynamic-system-host Essentially, I have an omnidirectional setup where a single Shell App consumes a set of Remote Apps. Remote Apps are discovered during runtime, and are hence not specified in the Webpack config.
The Shell, as well as all Remotes, have a dependency on a shared library, my-shared-lib:
"dependencies": {
"my-shared-lib": "^1.0.0"
}
The Shell, in its Webpack config, exposes this lib as an eager singleton:
new ModuleFederationPlugin({
name: 'shell',
filename: 'shellDefinition.js',
shared: {
'my-shared-lib': { singleton: true, eager: true, requiredVersion: '^1.0.0' }
},
}),
The Remotes, in their configs, also have it as shared, but not eagerly:
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' }
},
})
The problem is this: I have verified both by runtime debugging and inspecting the bundles generated by Webpack that this lib is being included and instantiated several times - once for the shell, and once for each remote. The code for the lib is even present in the bundle for the Remote which Webpack loads when fetching the exposed ./app.js.
I am at a loss for understanding what is going on here. I have tried to also share every single dependency of my-shared-lib, but this does not help.
My expectation would be that the Remotes use the instance of my-shared-lib which is shared by the Shell, rather than creating their own instances.
Have I completely misunderstood how dependency sharing works, or am I doing something else wrong?
It should be noted that both the Shell and the Remots all have single entry points.