Загрузка нескольких элементов Angular в одном окне

Что может пойти не так при попытке последовательно открыть микроприложения в одном окне?

У нас есть этот вариант использования, который нам нужен для поддержки нашего проекта, который требует, чтобы хост-система загружала первое микро-приложение с элементом angular вместе со всеми его зависимостями (файлы .js), а затем позволяла загружать другое микро-приложение с тем же подходом. Казалось, что это очень легко сделать, но мы столкнулись с проблемами, когда начали внедрять этот подход.

Первое микроприложение загрузилось без проблем. Однако по какой-то причине второе микроприложение не было обработано, хотя мы ясно видим, что все зависимости (файлы .js) были загружены внутри браузера. Мы даже не увидели ошибок в консоли браузера, поэтому не могли понять, в чем проблема. Потратив несколько часов на анализ кода, я наконец понял, в чем проблема.

Проблема:

Оказывается, мы столкнулись с проблемой с глобальной переменной «webpackJsonp» при загрузке нескольких угловых элементов из разных микро-приложений. Когда мы загрузили первый элемент angular, он создал переменную webpackJsonp внутри объекта окна. Второе микроприложение должно было переопределить содержимое первого микроприложения, объявленное в этой переменной, но этого не произошло, и все это было из-за простой проблемы - оба микроприложения использовали одно и то же имя переменной!

Решение:

Чтобы избежать конфликта, нам просто пришлось переопределить имя переменной по умолчанию «webpackJsonp» некоторым уникальным именем переменной, специфичным для приложения или элемента angular. Выполните следующие шаги, чтобы реализовать решение.

  1. Установите custom-webpack из модуля angular-builders
npm i -D @angular-builders/custom-webpack

2. Внесите следующие изменения в angular.json.

  • измените свойство builder на @ angular-builders / custom-webpack: browser.
  • добавьте свойство customWebpackConfig, как показано ниже.
"architect”: {
“build”: {
“builder”: “@angular-builders/custom-webpack:browser”,
“options”: {
“customWebpackConfig”: { “path”: “./extra-webpack.config.js”,
“mergeStrategies”: { “externals”: “replace” } }

3. Создайте файл конфигурации «extra-webpack.config.js» в корневой папке проекта с приведенным ниже содержимым.

  • jsonpFunction - дать уникальное имя, которое характерно для элемента angular или microapp
  • библиотека - укажите имя приложения или угловой элемент
module.exports = {
  output: {
  jsonpFunction: ‘webpackJsonpAppname’,
  library: ‘appname’
  }
};

4. При сборке проекта вы увидите содержимое main.js, как показано ниже. Переменная webpackJsonP будет заменена именем, указанным в вашем файле конфигурации «extra-webpack.config.js».

var appname=(window.webpackJsonpAppname=window.webpackJsonpAppname||[])..........

5. Когда вы импортируете этот файл, не будет никаких конфликтов с другими микроприложениями, поскольку мы переименовали глобальную переменную в специфичную для микроприложения. При таком подходе мы можем успешно загрузить более одного углового микро-приложения в одно окно.