Инициализация дочернего приложения федерации модулей углового веб-пакета

#angular #webpack #webpack-module-federation

Вопрос:

Проблема

Мы создаем новый набор приложений с использованием Angular 12 и федерации модулей Webpack. Мы следовали множеству руководств, и в основном все работает. Сейчас мы находимся на том этапе, когда нам нужно, чтобы наше приложение хоста/оболочки запрашивало информацию из нескольких дочерних приложений, в первую очередь, когда хост/оболочка инициализируется, и мы не можем понять, как это сделать. ПРИМЕЧАНИЕ: Все задействованные приложения, как оболочка, так и все дочерние, будут угловыми 12 . Мы не смешиваем разные рамки.

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

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

tl;dr: Как наше приложение оболочки может вызвать некоторое поведение инициализации по требованию в определенных дочерних приложениях, которые будут известны только во время выполнения? У нас есть все, что работает для этого, за исключением фактического запуска дочерних приложений без прямой маршрутизации к ним. Никакой связи не требуется, у нас уже есть рабочая реализация обмена сообщениями, нам просто нужно запустить код в первую очередь.

Вещи, которые мы пробовали

Мы испробовали два решения. Первый смоделирован по образцу этой статьи Манфреда Штайера, в основном динамически загружающего удаленный компонент, который вызывает ngOnInit() вызов. Во — вторых, динамически создавать <router-outlet> s. У обоих из них есть проблемы (среди прочего, множество ошибок, связанных с вызовом inject() вне контекста инъекции). Мы можем продолжить работу над этими вопросами, но я чувствую, что для этого уже должно быть решение, поэтому я решил спросить.