К сожалению, моя репро для этого находится в сложном проприетарном проекте, поэтому я сделаю все возможное, чтобы объяснить, что происходит.
Ближайший пример проекта к моему варианту использования: https://github.com/module-federation/module-federation-examples/tree/master/dynamic-system-host По сути, у меня есть всенаправленная настройка, в которой одно приложение Shell использует набор Удаленные приложения. Удаленные приложения обнаруживаются во время выполнения и, следовательно, не указываются в конфигурации Webpack.
Оболочка, как и все пульты дистанционного управления, зависит от разделяемой библиотеки 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, что эта библиотека включается и создается несколько раз - один раз для оболочки и один раз для каждого пульта дистанционного управления. Код для библиотеки даже присутствует в комплекте для Remote, который загружается Webpack при извлечении открытого ./app.js.
Я не понимаю, что здесь происходит. Я попытался также поделиться всеми зависимостями my-shared-lib, но это не помогло.
Я ожидал, что Remote будут использовать экземпляр my-shared-lib, который используется оболочкой, а не создавать свои собственные экземпляры.
Я совершенно неправильно понял, как работает совместное использование зависимостей, или я делаю что-то еще не так?
Следует отметить, что и Shell, и Remot имеют одну точку входа.