WU / DOCSMICROFRONTENDS UNIVERSAIS
PT

Ciclo de vida e propriedade

Registro, mount, props vivas, desmontagem, keep-alive e limpeza de recursos por aplicação.

Veja versões, mudanças e requisitos em Framework 4.0 e CLI 1.2.

Registro não equivale a montagem

wu.init registra metadados e permissões. wu.define registra funções. wu.mount resolve uma app, prepara seu contêiner, carrega sua entrada se faltar a definição e executa o renderizador. O nome une essas três etapas.

import { wu } from 'wu-framework';

let stop = () => {};
let abort = null;

wu.define('activity', {
  mount(container, { wu: appWu }) {
    abort = new AbortController();
    const output = document.createElement('output');
    const refresh = () => {
      output.textContent = String(appWu.store.get('activity.count') ?? 0);
    };
    container.replaceChildren(output);
    stop = appWu.store.on('activity.count', refresh);
    refresh();
    container.addEventListener('click', () => {
      appWu.emit('activity:opened', { source: 'counter' });
    }, { signal: abort.signal });
  },
  update(container, props) {
    container.setAttribute('aria-label', props.label ?? 'Actividad');
  },
  unmount(container) {
    stop();
    abort?.abort();
    container.replaceChildren();
  },
});

A app precisa de solicitações e concessões para ler activity.count e emitir activity:opened. O exemplo mantém a fachada recebida; o import de wu é usado para registrar o ciclo de vida.

Slots disponíveis

Slot Assinatura / uso
mount (container, { appName, wu }); obrigatório
unmount (container, context); libera renderizador, listeners e recursos próprios
update (container, nextProps); atualização sem desmontar
hydrate (container, { appName, wu, props }); adota markup SSR
deactivate (container); invocado antes de ocultar com keep-alive
activate (container); reativa uma app preservada

Os slots aceitam promises. Rejeitar uma promise em mount permite ao core limpar a tentativa e consultar a recuperação. Ocultar um erro sem renderizar nada pode fazer o WU considerar a montagem bem-sucedida; lance erros quando realmente não puder montar.

Sequência observável

A montagem executa beforeLoad, o hook de plugin beforeMount, cria o sandbox, executa afterLoad, obtém ou carrega a definição, executa beforeMount, aguarda os estilos e chama hydrate ou mount. Depois, registra o estado montado e executa os hooks posteriores.

afterLoad é executado após criar o sandbox e antes de resolver/carregar o ciclo de vida. Use afterMount quando precisar reagir à árvore já montada.

O core serializa as transições no mesmo contêiner. Uma app não deve apagar um nó cuja propriedade já foi transferida a outra. Também há contagem de referências e desmontagem adiada para absorver ciclos de integração como React StrictMode. Se vários consumidores compartilham uma app, cada montagem deve ter uma desmontagem correspondente.

Props vivas

const updated = await wu.update('activity', { label: 'Actividad reciente' });
if (!updated) console.info('La app no aplicó esta actualización');

update não fabrica um renderizador se a app não implementar esse slot. Os adaptadores React e Vue mantêm props e atualizam sua raiz sem remontagem. As props iniciais são configuradas no registro do adaptador ou no SSR; WuLifecycle.mount não declara context.props para a montagem normal.

Ocultar e destruir

await wu.hide('activity');
console.log(wu.isHidden('activity'));
await wu.show('activity');
await wu.unmount('activity', { force: true });

hide mantém DOM, iframe quando existe, estado, timers e listeners. A aplicação continua consumindo recursos; deactivate é o lugar para pausar trabalho próprio que não interessa enquanto ela está oculta. show restaura a visibilidade e executa activate sem carregar a entrada novamente.

unmount resolve keepAlive nesta ordem: force obriga a destruir; caso contrário, prevalece a opção da chamada, depois a configuração da app e, por fim, false. Desmontar completamente revoga a identidade com escopo, os listeners e os handlers associados. Uma referência a context.wu mantida após a desmontagem falha com WU_APP_SCOPE_REVOKED.

wu.destroy() limpa o runtime completo. Use quando o shell deixar de existir, não para mudar uma única seção. wu.app(name, config) entrega um wrapper com mount, unmount, hide, show, remount, reload, verify, start, stop e destroy.

Wrapper: registro adiado e concorrência

wu.app(name, config) agrupa a identidade, a configuração e o destino de uma aplicação. Criar o wrapper mantém esses dados; o registro efetivo ocorre na montagem, pelo core e sua validação de manifesto e permissões. Se o core ainda não tiver sido iniciado, o wrapper inicia essa configuração antes de montar.

const widget = wu.app('widget', {
  url: '/apps/widget',
  container: '#widget-slot',
  framework: 'vue',
  grants: [],
});
await widget.mount();
console.log(widget.isMounted, widget.info.container);
await widget.hide();
await widget.show();
await widget.unmount({ force: true });

A URL deve servir o manifesto de widget. mount(selector) permite escolher outro destino e o mantém para chamadas posteriores sem argumento. Os métodos de montagem, desmontagem, visibilidade, remount e reload resolvem para o mesmo wrapper, permitindo inspecionar seu estado ao terminar.

Membro Uso
mount(selector?) / start(selector?) Registrar se necessário e montar em um seletor string
unmount(options?) / stop() Desmontar; stop usa as opções padrão
hide() / show() Manter e reativar uma app montada
remount(selector?) Forçar a desmontagem e montar novamente
reload() Desmontar, limpar os caches disponíveis de loader/manifesto e montar novamente
isMounted / isHidden Consultar o estado do wrapper e do core
info Nome, URL, seletor, montagem e status
verify() Inspecionar registro, seletor e Shadow DOM do contêiner

Se outro init estiver em andamento, o wrapper o aguarda e registra sua app depois, se ela ainda faltar. Dois mounts concorrentes no mesmo wrapper compartilham uma promise de registro; cada montagem continua participando da propriedade e da contagem de referências do core. Uma falha libera essa promise para permitir uma nova tentativa. Um registro existente do host é mantido, sem sobrescrever suas concessões com as de outro wrapper.

reload() não invalida o cache nativo de módulos ESM do navegador nem garante baixar uma versão diferente da mesma URL. Para atualizar uma versão implantada, publique entradas com identidade de build e coordene seu carregamento pelo shell.

verify().container.hasContent inspeciona os filhos do ShadowRoot do slot; um resultado false não comprova que um renderizador com propriedade própria ou light DOM esteja vazio. WuApp.destroy() remove a app do mapa público, mas não limpa todos os registros de manifesto associados. Para remover um renderizador, use unmount; para reinicializar o shell completo, use wu.destroy() e um novo init, em vez de tratar o destroy do wrapper como uma operação geral de substituição de identidade.

Referência de implementação

Slots: src/index.d.ts; definição: src/core/wu-core.js; montagem: src/core/wu-core.js; atualização: src/core/wu-core.js; encerramento: src/core/wu-core.js; keep-alive: src/core/wu-core.js; wrapper: src/core/wu-app.js. Testes: tests/unit/keep-alive.test.js, tests/unit/props-channel.test.js, tests/unit/shared-container-navigation.test.js, tests/unit/scoped-events-teardown.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.