Singleton instantiated multiple times, despite same version being provided to all modules
See original GitHub issueUnfortunately, 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 loads the Remotes in exactly the same way as the example project above does (see https://github.com/module-federation/module-federation-examples/blob/master/dynamic-system-host/app1/src/App.js#L3)
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.
Issue Analytics
- State:
- Created 3 years ago
- Comments:10 (4 by maintainers)
Top GitHub Comments
@jacob-ebey I fully understand that, and as I mentioned this is unfortunately a pretty complex proprietary project, so not much I can share that fully reproduces the issue. I appreciate your help and will leave another comment here if I get bootstrapping to work.
Another note: I have observed this behavior for third-party libraries as well, notably https://github.com/styled-components/styled-components, the entire code for that library is also a part of the Remote bundle even though it is specified as a shared singleton in both Shell and Remote.