WU / DOCSMICROFRONTENDS UNIVERSAIS
PT

Astro, React, Vue e adaptadores

Composição poliglota com script cliente Astro, adaptadores reais e uma ponte manual que mantém a fachada com escopo.

Um shell Astro com apps independentes

Astro pode servir o conteúdo editorial e os slots, enquanto o WU carrega aplicações com seu próprio build Vite. O import do runtime que monta DOM deve estar em um <script> processado pelo Astro, não ser executado como montagem no frontmatter do servidor.

---
const title = 'Laboratorio políglota';
---
<html lang="es">
  <head><meta charset="utf-8" /><title>{title}</title></head>
  <body>
    <main>
      <div id="react-slot"></div>
      <div id="vue-slot"></div>
    </main>
    <script>
      import { wu } from 'wu-framework';
      await wu.init({
        apps: [
          { name: 'react-demo', url: '/apps/react-demo', framework: 'react' },
          { name: 'vue-demo', url: '/apps/vue-demo', framework: 'vue' },
        ],
      });
      await Promise.all([
        wu.mount('react-demo', '#react-slot'),
        wu.mount('vue-demo', '#vue-slot'),
      ]);
    </script>
  </body>
</html>

Os dois diretórios públicos devem conter seus manifestos e assets compilados. Para estado e eventos com escopo, adicione solicitações em cada manifesto e as concessões correspondentes em ambas as configurações do host.

Entrada React com adaptador

import * as React from 'react';
import * as ReactDOM from 'react-dom/client';
import { register } from 'wu-framework/adapters/react';
import App from './App.jsx';

const registered = await register('react-demo', App, {
  runtime: { React, ReactDOM },
  standalone: false,
  strictMode: true,
  props: { label: 'React' },
});
if (!registered) throw new Error('No se pudo registrar react-demo');

A injeção runtime permite ao adaptador usar as mesmas instâncias da sua aplicação. Importe ReactDOM de react-dom/client: a montagem requer createRoot, mesmo que o intervalo do peer de React seja mais amplo. Para hidratar, o runtime também deve oferecer hydrateRoot.

O adaptador mantém raízes por nome, implementa update mesclando props e oferece hidratação por hydrateRoot quando disponível. standalone é true por padrão e procura #root se não encontrar o WU; desative-o para que um microfrontend integrado não seja montado acidentalmente em outro lugar.

Entrada Vue com adaptador

import { register, wuVuePlugin } from 'wu-framework/adapters/vue';
import * as Vue from 'vue';
import App from './App.vue';

const registered = await register('vue-demo', App, {
  standalone: false,
  props: { label: 'Vue' },
  setup(app) {
    app.use(wuVuePlugin, { Vue });
  },
});
if (!registered) throw new Error('No se pudo registrar vue-demo');

O register do Vue resolve seu runtime pelo mecanismo do adaptador; não tem a opção React runtime. setup recebe a app antes de montar para registrar plugins ou roteador. O plugin aceita o namespace Vue para resolver helpers em contextos sem bare imports nem window.Vue; entregar o namespace em setup não substitui por si só a resolução inicial de register.

A atualização usa props reativas na raiz quando Vue oferece reactive. A hidratação é anunciada quando existe createSSRApp. O padrão de standaloneContainer é #app.

Manter a autoridade com escopo

No 4.0, os adapters React/Vue passam a facade à árvore de componentes, e seus hooks de eventos/store aplicam os grants da microapp. Declare as solicitações do manifest e os grants do shell. O padrão manual abaixo continua útil para um renderer próprio ou uma dependência explícita appWu.

Para um renderer personalizado, registre um lifecycle explícito e passe a facade como dependência:

import { wu } from 'wu-framework';
import * as React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App.jsx';

let root;
let appWu;
let props = {};
const render = () => root.render(React.createElement(App, { ...props, appWu }));

wu.define('react-demo', {
  mount(container, context) {
    appWu = context.wu;
    root = createRoot(container);
    render();
  },
  update(_container, nextProps) {
    props = { ...props, ...nextProps };
    render();
  },
  unmount() {
    root?.unmount();
    root = undefined;
    appWu = undefined;
  },
});

No Vue, o mesmo padrão usa createApp(App, { appWu: context.wu }), app.provide('appWu', context.wu) e app.unmount(). Se precisar de props vivas, mantenha um objeto reactive e atualize-o no slot update.

Integrações incluídas no pacote

Os seguintes subcaminhos fazem parte do pacote:

Import Função
wu-framework/integrations/astro Factory para astro.config.mjs
wu-framework/integrations/astro/WuShell.astro Inicializa apps do shell
wu-framework/integrations/astro/WuApp.astro Slot de montagem, com lazy opcional
wu-framework/integrations/astro/WuAppSSR.astro Renderização de servidor e montagem/hidratação cliente
wu-framework/integrations/next Integração Next e componentes do pacote

Importe a integração e seus componentes de wu-framework/integrations/astro. Os tipos do wrapper Astro expõem menos configuração que WuCore; um bootstrap cliente explícito permite controlar concessões e ordem de inicialização quando o shell precisa dessa configuração adicional.

Há adaptadores separados para React, Vue, Angular, Svelte, Preact, Solid, Lit, Vanilla, Alpine, Qwik, Stencil, HTMX e Stimulus. Selecione o do renderizador da sua aplicação e verifique seus slots: montagem, props vivas, hidratação e transmissão do contexto têm contratos específicos em cada adaptador.

Referência de implementação

Exportações: package.json; React: src/adapters/react/index.js e src/adapters/react/index.js; Vue: src/adapters/vue/index.js e src/adapters/vue/index.js; Astro: integrations/astro/index.js, integrations/astro/WuShell.astro, integrations/astro/WuApp.astro. Testes: tests/unit/react-runtime-injection.test.js, tests/unit/adapter-conformance.test.js, tests/unit/adapter-slots.test.js, tests/unit/vue-slot-mount-target.test.js.

CONSTRUA O WU CONOSCO

Encontrou um bug? Tem uma ideia?

Sua experiência melhora o WU. Conte o que falhou ou ajude a manter seu desenvolvimento.