Apps Micro Frontend (view.page)
Uma entrada view.page descreve uma aplicação single-page completa que o Web Host carrega dentro de um iframe. Cada entrada de página reivindica um caminho de URL no roteador do host, recebe seu próprio contexto de navegação isolado e recebe CSS e configuração injetados pelo host através da camada de proxy.
Campos de Frontend (bloco wippy do package.json)
Estes campos são escritos pelo desenvolvedor de FE no bloco wippy do package.json. O plugin do vite os grava no wippy-meta.json em tempo de build, e o wippy/views os lê de lá como padrões.
Todos os campos desta seção podem ser sobrescritos pelo operador no
_index.yaml. O YAML sempre tem precedência.
Exibição e Navegação
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
title |
string | — | Rótulo exibido na barra lateral de navegação e na aba do navegador |
icon |
string | — | Referência de ícone Iconify, por exemplo tabler:layout-dashboard |
type |
string | — | Deve ser "page" |
path |
string | — | Caminho até o arquivo HTML de entrada compilado, dentro do diretório de saída do bundle |
Render engine
renderEngine seleciona a render engine da página para esta página (apenas view.page). A engine é transparente para o código do app — a mesma página renderiza de forma idêntica em ambos os casos — então defina-a apenas para tirar uma página da engine de fragment, ou colocá-la nela.
| Valor | Efeito |
|---|---|
"auto" (padrão, ou omitido) |
Segue o switch global do deployment (hostConfig.renderEngine, definido pelo parâmetro de facade render_engine). |
"iframe" |
Sempre renderiza como um iframe srcdoc, independentemente do switch. Use para páginas com tecnologia incompatível com reframing — hit-testing de ponteiro (elementFromPoint), layout com unidades de viewport (vh/vw, matchMedia), position: fixed. |
"fragment" |
Prefere a engine Web Fragment. Em um deployment global-fragment: sempre. Em um deployment global-iframe: apenas se uma sondagem de capacidade em runtime confirmar que o gateway /@fragment + proxy estão presentes (com fallback seguro para iframe caso contrário). |
{
"wippy": {
"type": "page",
"renderEngine": "auto"
}
}
Veja Render Engines para o modelo completo de engines e as limitações de fragment.
Configuração do Proxy
A injeção de proxy tem duas superfícies. O desenvolvedor de FE escreve os padrões
no bloco wippy do package.json do frontend com chaves em lower-camel-case
(themeConfig, primevue, customCss); o plugin do Vite as grava no
wippy-meta.json. O operador as sobrescreve com um bloco proxy: sob
meta: no YAML do registry. Os campos do registry seguem seu schema documentado, e não
uma regra universal de casing. Chaves aninhadas de proxy mantêm seus nomes definidos em
lower-camel-case, e o host faz deep-merge desse YAML sobre os padrões de frontend
gravados, sem converter chaves.
{
"wippy": {
"type": "page",
"proxy": {
"enabled": true,
"injections": {
"css": {
"themeConfig": true,
"iframe": true,
"primevue": true,
"markdown": false,
"customCss": true,
"customVariables": true
},
"tailwindConfig": false,
"resizeObserver": false,
"preventLinkClicks": false,
"iconifyIcons": false,
"errorCapture": true
}
}
}
}
proxy.enabled: true significa que o Web Host envolve a página em seu harness de iframe de proxy, que escreve window.__WIPPY_APP_CONFIG__ e globais relacionados antes de o bundle da página ser avaliado.
Se proxy.injections for omitido, o proxy de iframe usa padrões de runtime permissivos e habilita a maioria das injeções. A lista abaixo mostra os valores explícitos recomendados para um app micro frontend Vite típico — não os padrões de runtime — para que revisores de pacote possam ver a intenção da página.
Valores explícitos de injeção recomendados
Estas são as flags que um app micro frontend normalmente declara e o valor a definir para um SPA Vite típico. Elas não são os padrões de runtime.
css.themeConfig(true) — propriedades CSS customizadas do tema ativocss.iframe(true) — estilização padrão obrigatória de scrollbar tematizada;iframeé um nome histórico e a folha atual não fornece resets de layoutcss.primevue(true) — estilos base de componentes PrimeVuecss.markdown(false) — estilos de renderização de markdowncss.customCss(true) — CSS customizado projetado pelo filhocss.customVariables(true) — sobrescritas de variáveis CSS projetadas pelo filhotailwindConfig(false) — objeto de configuração Tailwind do host (apenas Tailwind via CDN)resizeObserver(falsepara SPAs completos) — atualizações do tamanho do body do filho para o hostpreventLinkClicks(falsepara páginas) — roteia cliques em<a>através declassifyLinkiconifyIcons(false) — pré-carrega coleções Iconify do hosterrorCapture(true) — encaminha erros não capturados do iframe para o host
A maioria das páginas SPA completas define resizeObserver: false e preventLinkClicks: false porque gerenciam seu próprio layout e roteamento. O app main do template define errorCapture: true para expor erros não capturados durante o desenvolvimento.
Não existe uma flag dedicada de injeção de web fonts. Google Fonts são entregues através de theming.global.customCSS (um @import no CSS customizado do tema), injetado pela flag css.customCss existente.
Referência completa de flags e padrões de runtime: Injeção de CSS.
Configuração do Operador (_index.yaml)
Estes campos são definidos pelo operador no bloco meta da entrada de registry do _index.yaml. A maioria deles — announced, secure, url, base_path, mountRoute, auto_register, inline — representa política de deployment (roteamento, controle de acesso e serving) que só faz sentido em tempo de deploy e não possui superfície de autoria no package.json. A única exceção é entry_point: ele é autorado pelo FE (o plugin do vite exige wippy.path no package.json e o grava no wippy-meta.json), e o campo meta.entry_point é apenas uma sobrescrita opcional por deployment desse padrão gravado.
Formato YAML obrigatório: uma entrada de página é
kind: registry.entrycommeta.type: view.page. Não escrevakind: view.page.
- name: main
kind: registry.entry
meta:
type: view.page
name: main
Os campos de política de deployment (
announced,secure,url,base_path,mountRoute,auto_register,inline) não podem ser definidos nopackage.json— eles são definidos pelo operador para cada ambiente.entry_pointé diferente: é autorado comowippy.pathnopackage.json, e o valor em YAML apenas sobrescreve esse padrão.
URL e Serving de Arquivos
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
url |
string | — | Prefixo de URL base onde o bundle está montado (origem de CDN ou caminho http.static local). Somente YAML — sem superfície no package.json |
base_path |
string | — | Subdiretório dentro do mount estático. Somente YAML — sem superfície no package.json |
entry_point |
string | index.html |
Arquivo HTML a carregar; combinado com url e base_path. Autorado pelo FE como wippy.path no package.json (gravado no wippy-meta.json); o valor em YAML é uma sobrescrita opcional por deployment |
A URL de entrada resolvida é <url>/<base_path>/<entry_point>. Um operador faz deploy do mesmo bundle sob múltiplas entradas apontando diferentes entradas de _index.yaml para o mesmo base_path com valores diferentes de entry_point ou config_overrides.
Diferente de url e base_path, entry_point não é um campo exclusivo de deploy. Ele é autorado pelo desenvolvedor de FE como wippy.path no bloco wippy do package.json e gravado no wippy-meta.json pelo plugin do vite — o plugin o exige e lança wippy.path is required for a page package se for omitido. O campo meta.entry_point no _index.yaml apenas sobrescreve esse padrão gravado por deployment; a ordem de resolução é entry_point do YAML → wippy.path do bundle → index.html.
Visibilidade e Acesso
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
announced |
boolean | — | true → a página aparece em GET /api/public/pages/list e na barra lateral de navegação |
secure |
boolean | false |
true → exige autenticação; requisições não autenticadas recebem 401 |
inline |
boolean | false |
true → a página fica oculta em todas as listagens (barra lateral, API); use para visualizadores de artefatos incorporados ou rotas auxiliares |
announced: false oculta a página da navegação, mas não impede o carregamento. Um iframe ou uma URL direta ainda funcionam. inline: true é mais restritivo — ele suprime a página de todas as listagens públicas.
Rota de Mount
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
mountRoute |
string | — | Reivindica um caminho de URL no roteador do host; o host renderiza esta página quando o navegador navega para um caminho correspondente |
Grafia temporária de compatibilidade:
meta.mountRouteé um bug de casing atual do backend. O campo pretendido no backend émeta.mount_route, e espera-se que uma versão futura do backend o altere. Usemeta.mountRouteaté que essa mudança de backend seja lançada; verifique novamente a versão do Wippy de destino ao atualizar.
mountRoute aceita apenas a forma catch-all v1 — /:part(.*)* (raiz) ou /<prefixo-literal>/:part(.*)*, onde o prefixo consiste em um ou mais segmentos alfanuméricos minúsculos com hífen, terminando no wildcard obrigatório :part(.*)*. Padrões arbitrários do Vue Router — parâmetros nomeados, regex customizada ou um nome de parâmetro diferente (por exemplo, /home/:id, /users/:userId(\d+)) — são rejeitados: o host levanta um conflito de mount-route do tipo syntax e GET /api/public/pages/routes retorna HTTP 500, renderizado como um erro fatal em tela cheia. O wildcard :part(.*)* permite que a aplicação filha gerencie suas próprias sub-rotas enquanto o host mantém a propriedade do caminho de nível superior.
mountRoute: /home/:part(.*)*
Quando o Web Host inicia, ele busca GET /api/public/pages/routes e chama router.addRoute() para cada entrada que tenha um mountRoute. Veja Roteamento Dinâmico para o mecanismo completo de sincronização.
Sobrescritas de Configuração por Página
| Campo | Tipo | Descrição |
|---|---|---|
config_overrides |
object | Deep-merge sobre os valores de AppConfig que o Web Host injeta no iframe |
config_overrides é o nome do wrapper no registry. Seu objeto aninhado já usa
as chaves em lower-camel-case do schema do frontend, como
customization.customCSS e customization.cssVariables. O Web Host
faz deep-merge dessas chaves exatas sobre o wippy.configOverrides do bundle
vindo do wippy-meta.json; o valor do YAML vence por chave aninhada.
config_overrides altera o AppConfig injetado na página. Ele não altera as flags de injeção do proxy. Em particular, config_overrides nunca afeta proxy.injections, wippy.proxy.injections ou os padrões de runtime para injeção de CSS/script. Para sobrescrever flags de injeção do proxy em um deployment, use meta.proxy conforme descrito em Sobrescrita de proxy pelo operador.
Um caso de uso típico é executar o mesmo bundle com uma paleta de cores customizada:
- name: iframe-demo-themed
kind: registry.entry
meta:
type: view.page
name: iframe-demo-themed
title: Iframe Demo (Custom Palette)
icon: tabler:paint
order: 4
announced: false
secure: false
url: /app
base_path: app/iframe-demo
entry_point: app.html
mountRoute: /demo-themed/:part(.*)*
config_overrides:
customization:
cssVariables:
"--p-primary": "#7c9ed9"
"--p-primary-color": "#7c9ed9"
"--p-danger": "#e8a0a0"
customCSS: |
/* Os valores de paleta aqui são uma definição intencional de tema de página, não CSS de módulo. */
:root { font-family: var(--wippy-brand-font, sans-serif); }
Note que announced: false é válido para entradas view.page — a página é acessível via seu mountRoute, mas não aparece na barra lateral.
Sobrescrita de proxy pelo operador (_index.yaml)
Os padrões de injeção de proxy gravados no wippy-meta.json (a partir do
bloco wippy do package.json) podem ser sobrescritos por deployment com um bloco
proxy: colocado sob meta: na entrada do registry. Nomes de requisitos de facade
usam seus nomes documentados em snake_case. Os campos do registry atualmente incluem um
bug temporário de casing no backend: o wrapper é config_overrides, enquanto o campo de
rota ainda é lido como mountRoute até ser corrigido para mount_route.
Objetos aninhados de proxy/config são repassados e mantêm suas chaves definidas em
lower-camel-case. O host faz deep-merge de meta.proxy sobre o wippy.proxy do bundle.
Resposta curta: use meta.proxy, não data.proxy; mantenha campos de backend de nível superior
como config_overrides em snake_case, mas preserve chaves aninhadas de proxy/config
como themeConfig e customCss; mantenha o wrapper injections.
Não invente meta.config ou meta.configOverrides; o wrapper exato de
sobrescrita por página é meta.config_overrides.
Mantenha as duas grafias de frontend distintas:
- O
meta.proxy.injections.css.customCssdo backend permanecewippy.proxy.injections.css.customCss. - O
meta.config_overrides.customization.customCSSdo backend projeta para owippy.configOverrides.customization.customCSSdo frontend e para oconfig.theming.global.customCSSdo runtime. - Não invente um wrapper
appConfigem torno de nenhum dos formatos de frontend.
- name: dashboard
kind: registry.entry
meta:
type: view.page
name: dashboard
url: /app
base_path: app/dashboard
entry_point: app.html
proxy:
enabled: true
injections:
css:
themeConfig: true
iframe: true
primevue: true
customCss: true
customVariables: true
tailwindConfig: false
iconifyIcons: false
Apenas as chaves que você define são sobrescritas; todo o resto mantém o valor gravado no wippy-meta.json. Referência completa de flags e padrões de runtime: Injeção de CSS.