Render Engines
O Web Host do Wippy renderiza um app micro frontend (view.page) através de uma de duas render engines de página. A engine é uma questão de entrega, escolhida por um switch do operador, com uma sobrescrita opcional por página. Apps portáveis usam as APIs de proxy e de router do Wippy, de modo que seu comportamento não depende de uma engine específica.
| Engine | Como uma página renderiza | Isolamento | Roteamento |
|---|---|---|---|
| Iframe (padrão) | Um <iframe> srcdoc com proxy.js injetado |
Isolamento completo de documento | Apenas memory history (srcdoc não tem URL real) |
| Web Fragment | Um realm de mesma origem reframed refletido em um shadow root <web-fragment>, com proxy-fragment.js |
Isolamento de realm, árvore DOM compartilhada | window.history real (routers de URL funcionam) |
Ambas as engines fornecem os mesmos serviços de aplicação do Wippy: API autenticada, WebSocket, estado mediado pelo host, diálogos de confirmação/ponte, eventos @history/@visibility, propagação de título, captura global de erros, injeção de CSS do host + tema (incluindo modo escuro dentro do shadow), auto-height em modo de conteúdo e embeds <w-artifact> aninhados. Suas capacidades de histórico de navegador são intencionalmente diferentes, como mostra a tabela.
Use createAppRouter() de @wippy-fe/router para um app que possa rodar sob qualquer uma das engines. A factory atual usa memory history, recebe sua rota inicial de AppConfig.context.route e sincroniza com o host através de @history. Um router direto com createWebHistory() funciona apenas com Fragment e não é portável para deployments em iframe ou auto que possam recair para iframe.
Como um fragment renderiza
Uma view.page selecionada para a engine de fragment é montada como <web-fragment src="/@fragment/{id}/">. O gateway /@fragment em wippy/views serve o contrato de reframing; o cliente reframed cria um iframe de realm oculto de mesma origem (wf:<id>), transmite o HTML transformado do gateway para o shadow root do fragment e executa proxy-fragment.js (um adaptador de @wippy-fe/proxy) dentro do realm para fornecer a API de proxy $W. Como o realm é de mesma origem que o host, o proxy fala com o host diretamente, em vez de via postMessage.
A mesma página sob a engine de iframe é um <iframe> srcdoc com proxy.js injetado — veja Proxy e Isolamento.
Selecionando a engine
Switch global (operador)
A engine de um deployment inteiro é o requisito render_engine da facade → hostConfig.renderEngine. O padrão é iframe; apenas a string exata fragment faz um deployment aderir à engine de fragment (qualquer outro valor, incluindo um erro de digitação, é tratado como iframe).
wippy run -c -o wippy.facade:render_engine:default=fragment
Veja Facade → Render engine para o parâmetro.
Sobrescrita por página (autor do app)
Uma página adere ou sai com wippy.renderEngine no bloco wippy do seu package.json:
| Valor | Comportamento |
|---|---|
"auto" (padrão) |
Segue o switch global. |
"iframe" |
Sempre renderiza como um iframe srcdoc — sai dos fragments, independentemente do switch. |
"fragment" |
Prefere a engine de fragment. Em um deployment global-fragment: sempre. Em um deployment global-iframe: apenas se uma sondagem de capacidade em runtime (GET /@fragment/{id}/, cacheada por sessão) confirmar que o gateway + proxy estão presentes; caso contrário, recai para iframe (à prova de falhas). |
Veja Apps Micro Frontend → Render engine.
Limitações de fragment
Algumas APIs de navegador se comportam incorretamente — e silenciosamente — dentro de um realm reframed. Uma página que depende de qualquer uma delas deve fixar wippy.renderEngine: "iframe".
| API / recurso | Comportamento em um realm | Impacto |
|---|---|---|
document.elementFromPoint |
Retorna null — independentemente do tamanho do painel |
Quebra o hit-testing de ponteiro: drag & drop, listas ordenáveis, Popper/floating-ui, scrollers virtuais |
matchMedia, unidades vh/vw, position: fixed |
Resolvem contra o viewport do host, não contra o painel do fragment | Erro de ~1px em um painel de tamanho completo; materialmente errado em um painel pequeno (barra lateral/modal) |
window.scrollX/Y, scrollTo |
Miram a janela oculta do realm (sempre 0) |
UI guiada por rolagem lê a geometria errada |
| Web Workers, Canvas, WebGL, WASM | Funcionam normalmente | — |
vh/vw e matchMedia aparecem aqui porque perguntam sobre a janela. Um app que se dimensiona contra sua surface alocada — container queries em wippy-surface e as variáveis --wippy-surface-* — resolve de forma idêntica sob ambas as engines e não precisa ser fixado. Veja Portabilidade de Surface e Migração de Surface para converter um app existente. position: fixed e elementFromPoint não têm forma portável e continuam sendo motivos genuínos para fixar.
Dois detectores expõem isso em tempo de autoria (eles detectam incompatibilidade do código do app, não erros de deployment):
- Tempo de build (
@wippy-fe/vite-plugin): varre o código-fonte da página e emite um aviso de build nomeando a API e sugerindowippy.renderEngine: "iframe". - Runtime de desenvolvimento (proxy de fragment, apenas em DEV): aplica patch a essas APIs para emitir um
console.warnuma vez em uma chamada real.
Habilitando fragments — resumo da configuração
Habilitar a engine de fragment em um app consumidor exige módulos de framework atualizados mais o switch do operador — sem ligação de router ou de parâmetros:
- Módulos de framework — use um par atual e compatível de
wippy/facadeewippy/viewsque exponha o switchrender_enginee o gateway de fragment auto-montável. Verifique a release exata na documentação atual dos módulos do Wippy. - O switch — defina o
render_engineda facade comofragment(globalmente) ou faça páginas aderirem individualmente comwippy.renderEngine.
O gateway
/@fragmenté autofornecido pelowippy/viewsatual: o módulo declara seu próprio router de nível superior e o vincula a um requisitoservercom padrãoapp:gateway. Um consumidor não precisa de nenhuma ligação de fragment e inicializa normalmente na engine de iframe, estejam os fragments habilitados ou não; sobrescreva o parâmetroserverapenas se o id do seuhttp.servicefor diferente deapp:gateway. Quando uma página adere aos fragments individualmente em um deployment que de resto usa iframe, uma sondagem de capacidade em runtime confirma o gateway +proxy-fragment.jsantes de trocar e, caso contrário, permanece na engine de iframe. O switch globalrender_engine: fragmentconfia no operador e não faz sondagem. Veja Views → Gateway de Web Fragments.
O próprio app de frontend não precisa de código específico de fragment; proxy-fragment.js é um artefato do host servido pela CDN, não algo que o app empacota.
Veja Também
- Facade — o switch de operador
render_engineehostConfig.renderEngine - Views — o gateway auto-montável
/@fragmente sua vinculaçãoserver - Apps Micro Frontend (view.page) — o campo
wippy.renderEnginepor página - Proxy e Isolamento — a API de proxy compartilhada (ambas as engines) e a engine de iframe
- Visão Geral do Web Host — como o host carrega e renderiza páginas