Module Federation, entre duas origens
Esta página é servida por samuelsantana.dev e monta, dentro da própria árvore React, um componente que vive em cygnus.samuelsantana.dev — repositórios diferentes, deploys diferentes, um único React. Nada do componente está no bundle desta página: ela carrega uma URL e o container do outro lado decide o que devolver.
Carregado de outra origem, em runtime
https://cygnus.samuelsantana.dev/mf/remoteEntry.js
Clique numa vacina: o remote chama um callback do host em vez de navegar.
A negociação do React, medida
Versão igual não é prova: duas cópias da mesma versão continuam sendo dois objetos. Identidade de referência é a única checagem que falha quando a negociação falha.
Medindo…
Se estas duas linhas dissessem NÃO, o widget ainda apareceria — e quebraria na primeira vez que tocasse em estado ou contexto do host, várias camadas longe da causa. É por isso que a prova precisa ser explícita.
Aqui as versões acabam corroborando. O Next empacota o próprio build de React para o App Router, então o host oferece um canary enquanto o remote foi compilado contra 19.2.8 — o remote relatar o canary é relatar uma versão que ele não carrega e só poderia ter recebido.
Por que não é o mesmo que o embed
O embed mostra estes mesmos dados por <script> e por iframe: DOM puro, shadow root, nenhum framework atravessando. Ele diz “não confio em você e você não deveria confiar em mim”.
Federação diz o contrário: “somos uma aplicação só, montada a partir de dois repositórios”. O componente recebe props, devolve callbacks e usa hooks da instância de React desta página. Em troca, esta página passou a depender da disponibilidade de outra origem — o botão acima mostra o que acontece quando ela falha.
Nenhum é a evolução do outro. Um host que não pode se comprometer com React 19 não tem o que fazer aqui e deve usar o iframe.
remoteEntry: https://cygnus.samuelsantana.dev/mf/remoteEntry.js