WP5 Module Federation: синглтон создается несколько раз

К сожалению, моя репро для этого находится в сложном проприетарном проекте, поэтому я сделаю все возможное, чтобы объяснить, что происходит.

Ближайший пример проекта к моему варианту использования: 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 имеют одну точку входа.


person csvan    schedule 27.12.2020    source источник
comment
Что вы имеете в виду под включением / созданием экземпляра для каждого пульта дистанционного управления? Вы загружаете несколько фрагментов с нескольких URL-адресов?   -  person Daniel Tabuenca    schedule 21.02.2021


Ответы (1)


для ваших удаленных конфигураций федерации модуля webpack попробуйте удалить опцию singleton (если она установлена ​​в обеих конфигурациях, может быть проблемой, вы хотите, чтобы только одно приложение инициализировало singleton) и опцию нетерпения (я думаю, что по умолчанию это false, эта опция сообщает загрузите зависимость перед проверкой общих, поэтому вы используете ее в основном в приложении контейнеров). Это то, что я делаю в своих конфигурациях (несколько пультов), и, похоже, это хорошо работает:

new ModuleFederationPlugin({
  name: 'remoteNameHere',
  filename: 'remoteDefinition.js',
  exposes: {
    './app': path.join(modulePath, 'app.js'),
  },
  shared: {
      'my-shared-lib': { requiredVersion: '^1.0.0' }
  },
})

PS (мы никогда не узнаем): у вас могут возникнуть проблемы с древовидными библиотеками при использовании федерации модулей, она загружает всю библиотеку, когда помещает их в общий доступ.

person flaviuse    schedule 29.12.2020