Федерация модулей Webpack. Неудовлетворенная версия 11.xx общего одноэлементного модуля @angular/common (требуется ^7.2.0)

Я пытаюсь заставить мое довольно сложное монолитное приложение работать с Module Federation. Конфигурация моего веб-пакета выглядит так

         plugins: [
    new ModuleFederationPlugin({
        remotes: {
            "mfe1": "mfe1@http://localhost:3000/remoteEntry.js",
        },
        shared: {
          "@angular/core": { singleton: true, strictVersion: true },
          "@angular/common": { singleton: true, strictVersion: true },
          "@angular/router": { singleton: true, strictVersion: true },
          ...sharedMappings.getDescriptors()
        }
    }),
    sharedMappings.getPlugin(),
  ],

То же самое и со стороны Micro Frontend. Когда я пытаюсь запустить приложение, я получаю:

Ошибка: неудовлетворенная версия 11.2.1 общего одноэлементного модуля @angular / common (требуется ^7.2.0)

До этого я получал аналогичное сообщение об ошибке, но для angular / core. Я исправил это, повторно запустив yarn и исправив все предупреждения, выдаваемые библиотеками в зависимости от другой версии angular / core.

Но с ошибкой fpr angular / common я застрял. Я понятия не имею, как узнать, какая библиотека могла бы вызвать эту ошибку.

3 ответа

Вам, вероятно, следует указать requiredVersion

на каждом из этих общих элементов. Если вы не укажете его, webpack попытается определить версии не только из вашего основного package.json, но и из любого пакета npm, который использует эти библиотеки angular в ваших node_modules.

Что произойдет, так это то, что всякий раз, когда вы импортируете сторонний модуль, который использует angular, он просканирует package.json для этого модуля и добавит другое сопоставление диапазона версий входа на основе этого. Это, вероятно, вызовет нежелательное поведение и может быть причиной того, что вы видите.

На данный момент у вас есть singleton: trueкоторый перезаписывает разные версии пакетов. Один вариант — использовать одинаковую версию пакета для всех микрофронтендов, а второй — можно немного изменить. sharedсинтаксис. Попробуйте что-то вроде этого: shared: [ "@angular/core", "@angular/common", "@angular/router", ...sharedMappings.getDescriptors() ]

Установка strictVersion значения true вместе с Singleton:true приведет к сбою приложения, если микроинтерфейс не получит точную версию общего артефакта от хоста.

Чтобы это исправить, установите для strictVersion значение false . и добавьте требуемую версию, требуемая версия также принимает в качестве значения диапазон поддерживаемых версий.

Пример: '@angular/core': { Singleton: true,strictVersion: false,requireVersion: '14.0.0', }

Ресурсы: https://www.angulararchitects.io/en/blog/getting-out-of-version-mismatch-hell-with-module-federation/

Другие вопросы по тегам