Esse repositório apresenta uma solução para composição via rotas entre dois Apps usando o Module Federation:
- Host
- Remote
Nesse exemplo, a composição ocorre a partir das rotas remote/*
.
Ambos os apps usam a build estática do Next.
Tecnologias:
- Next JS
- @module-federation/nextjs-mf
Para integrar o MFE Remote, as páginas das rotas /remote/*
são as mesmas, no entanto é necessário ter o conjunto:
index.tsx
[...paths].tsx
O arquivo remote-app.tsx
é exposto via Module Federation e possui as regras de carregamento das páginas a partir do pathname
. Para fazer esse roteamento é usado o routes-manifest.json
gerado pelo Next JS e que já contém as regras de regex
necessárias.
Limitações:
- Ao invés de adicionar contextos e regras ao arquivo
__app.tsx
, deve ser criado um componente que possui esses regras e é usado tanto no__app.tsx
como noremote-app.tsx
; - O módulo federado só funciona via client Side;
- O roteamento dinâmico não funciona usando o
router.query
, para isso foi criado um hook chamado deuseWatchParam
para tratar dopathname
;
O Module Federation só funciona com a aplicação compilada, portanto é necessário servir a aplicação Remote após o build.
Instalação dos pacotes:
yarn install
Rodar o Remote:
yarn run remote
# http://localhost:3000/remote
Rodar o Host:
yarn run host
# http://localhost:3001
Se tudo deu certo, a aplicação estará rodando na porta 3001
![image](https://private-user-images.githubusercontent.com/29892001/261418950-58bc781b-fca9-4f46-be5a-c14b7e286d75.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE3MzQ5MTYsIm5iZiI6MTcyMTczNDYxNiwicGF0aCI6Ii8yOTg5MjAwMS8yNjE0MTg5NTAtNThiYzc4MWItZmNhOS00ZjQ2LWJlNWEtYzE0YjdlMjg2ZDc1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzIzVDExMzY1NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE3ZTQzMzZjYzk5MmM5NDQ5NjQxMTkxNzQ5MTgwMjllZDczMDE0ZjAxMTQ5YTNmZDQ2M2M0Yzg5ZWU2YzcwYjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.WVLN-lgMOUDQOTx2duXDK9dlV8P2MBkhVO2XnQKhcPU)