Как использовать Angular Module Federation для импорта всего приложения
Я новичок в Ng Module Federation, но думаю, что у меня есть суть. Моя проблема в том, что большинство ссылок, которые я видел, либо импортируют один компонент, либо модуль, который лениво загружается в маршрутизатор. Я хотел бы включить на страницу все мини-приложение. Общая идея состоит в том, чтобы иметь поведение, подобное iFrame, без iFrame.
У меня есть исходное приложение, открывающее файл app.module.ts, и это, похоже, работает. Однако я не могу понять синтаксис для импорта этого модуля и использования его в качестве компонента в существующем компоненте.
Я попытался добавить loadRemoteModule({...}) в импорт модуля, в котором есть компонент, который будет использовать вложенное «представление приложения». Но это асинхронная функция, на раз и на два, что делать дальше я не знаю.
Кто-нибудь знает, как импортировать модуль и использовать его компоненты?
1 ответ
Я понял это и попытаюсь обобщить здесь:
Настройте веб-пакет для федерации модулей для модуля, который вы хотите выставить «как обычно». Здесь вы получите открытый URL-адрес для использования ниже. Ссылка здесь: https://module-federation.github.io/blog/get-started#:~:text=%3E%20yarn%20dev-,Start,-Federating
В приложении оболочки (тот, который использует федеративный модуль):
- создайте раздел «remotes:» с именем удаленного модуля и URL-адресом.
remotes: { 'myMicroFE@https://mywebsite.com/myMicroFE.js' }
- создайте раздел «remotes:» с именем удаленного модуля и URL-адресом.
Создайте родительский компонент, в котором будет размещаться MicroFE, используя в шаблоне что-то вроде этого:
<app-micro-fe-component></app-micro-fe-component>
и аналогичный код в файле .ts:
async ngOnInit() { const appModule: NgModule = await loadRemoteModule( { remoteEntry: 'https://mywebsite.com/myMicroFE.js', remoteName: 'myMicroFE', exposedModule: './AppModule', } ); const appModuleRef: NgModuleRef<any> = createNgModuleRef( appModule['AppModule'], this.injector ); const microFEComponent = this.vcref.createComponent( appModuleRef.instance.getComponent() ); // Sample interaction with the component. this.renderer.listen('window', 'message', (event) => { if (event.data && event.data.providerId) { this.microFEClicked.emit(event.data); } }); ...
Очевидно, что такие имена, как MyMicroFE, здесь для удобочитаемости, вы можете использовать свои собственные имена.