vitral 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -20
- package/dist/vue.d.ts +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
<p align="center"
|
|
2
|
-
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/joaogabriel15/vitral/main/docs/public/marca/banner-escuro.png">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/joaogabriel15/vitral/main/docs/public/marca/banner.png" width="640" alt="vitral. Feito de partes. Visto como um todo.">
|
|
5
|
+
</picture>
|
|
6
|
+
</p>
|
|
6
7
|
|
|
7
8
|
<p align="center">
|
|
8
9
|
<a href="https://github.com/joaogabriel15/vitral/actions/workflows/ci.yml"><img src="https://github.com/joaogabriel15/vitral/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
@@ -11,15 +12,57 @@
|
|
|
11
12
|
<a href="https://github.com/joaogabriel15/vitral/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/vitral" alt="licença MIT"></a>
|
|
12
13
|
</p>
|
|
13
14
|
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="https://joaogabriel15.github.io/vitral/">Documentação</a> ·
|
|
17
|
+
<a href="https://joaogabriel15.github.io/vitral/aprender/configurar">Começar</a> ·
|
|
18
|
+
<a href="https://joaogabriel15.github.io/vitral/por-que">Por que o vitral</a> ·
|
|
19
|
+
<a href="https://joaogabriel15.github.io/vitral/aprender/benchmark">Benchmark</a> ·
|
|
20
|
+
<a href="./README.en.md">English</a>
|
|
21
|
+
</p>
|
|
22
|
+
|
|
14
23
|
Junte micro-frontends de qualquer framework numa página só, sem configuração de build no host.
|
|
15
24
|
|
|
25
|
+
Cada equipe publica o próprio pedaço da página (um remote) com `vite build`. O host recebe a URL de cada remote e monta tudo no navegador.
|
|
26
|
+
|
|
27
|
+
**Por que usar:**
|
|
28
|
+
|
|
29
|
+
- **Zero configuração no host.** Sem plugin de build: só `configure({ remotes })` com a URL de cada remote.
|
|
30
|
+
- **Qualquer framework.** React, Next, Vue, Nuxt, Angular, Svelte, Solid, Preact, Lit e JS puro na mesma página. Sem combinar versão de React entre equipes.
|
|
31
|
+
- **Deploy independente.** Cada equipe publica quando quiser. O host vê a versão nova sem novo build.
|
|
32
|
+
- **CSS e erros isolados.** O CSS de um remote não muda o resto da página. Um remote fora do ar mostra o próprio erro, e o resto continua funcionando.
|
|
33
|
+
- **Seguro.** O JS só roda se vier de uma origem permitida e se o hash SHA-384 bater.
|
|
34
|
+
- **Leve e rápido.** 3,4 kB de host. Primeira visita 57% mais rápida que o Module Federation e troca de área 4,6 vezes mais rápida que o Next.js Multi-Zones.
|
|
35
|
+
|
|
16
36
|
```bash
|
|
17
37
|
npm install vitral
|
|
18
38
|
```
|
|
19
39
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
40
|
+
<p align="center">
|
|
41
|
+
<picture>
|
|
42
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/joaogabriel15/vitral/main/docs/public/marca/como-funciona-escuro.png">
|
|
43
|
+
<img src="https://raw.githubusercontent.com/joaogabriel15/vitral/main/docs/public/marca/como-funciona.png" width="900" alt="Três equipes (React, Vue, Angular) publicam um vitral.json cada uma num CDN. O host lê as URLs com configure e monta os três remotes na mesma página.">
|
|
44
|
+
</picture>
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
## Comparação
|
|
48
|
+
|
|
49
|
+
| | Module Federation | single-spa | Next.js Multi-Zones | vitral |
|
|
50
|
+
|---|---|---|---|---|
|
|
51
|
+
| Configuração no host | Plugin no build, combinado com cada remote | Root config e import map | Um app Next por zona e rewrites | Nenhuma. Só `configure()` |
|
|
52
|
+
| Frameworks | Combinar versões em `shared` | Um adaptador e um ciclo de vida por framework | Só Next | Qualquer um, sem combinar versão |
|
|
53
|
+
| Divide a página em | Pedaços | Apps por rota | Rotas (cada zona é uma página) | Pedaços ou rotas |
|
|
54
|
+
| Trocar de área | Sem recarregar | Sem recarregar | Recarrega a página e baixa Next e React de novo | Sem recarregar |
|
|
55
|
+
| Isolamento de CSS | Nenhum | Nenhum | Por página | Escopo automático ou Shadow DOM |
|
|
56
|
+
| Remote fora do ar | Erro sem tratamento derruba a página | A tela de erro é com você | A zona inteira fica fora | Só aquele remote mostra erro, com `retry` |
|
|
57
|
+
| Código de host (brotli) | 19,4 kB | 5,8 kB | Runtime do Next em cada zona | 3,4 kB |
|
|
58
|
+
|
|
59
|
+
Medido no [benchmark público](https://joaogabriel15.github.io/vitral/aprender/benchmark) (Chromium, rede Slow 4G, mediana de 7 visitas):
|
|
60
|
+
|
|
61
|
+
- **57% menos tempo** na primeira visita que o Module Federation com React compartilhado (1157 ms contra 2673 ms, 1 remote).
|
|
62
|
+
- **4,6 vezes mais rápido** para trocar de área que o Next.js Multi-Zones (184 ms contra 850 ms), com 63% menos bytes para abrir duas áreas.
|
|
63
|
+
- **10 frameworks** cobertos por testes de ponta a ponta no CI, com host e remote de frameworks diferentes, em Chromium, Firefox, WebKit e mobile.
|
|
64
|
+
|
|
65
|
+
O método e as versões usadas estão na página do benchmark.
|
|
23
66
|
|
|
24
67
|
## Começo rápido
|
|
25
68
|
|
|
@@ -77,6 +120,55 @@ Sem build no host, numa página HTML qualquer:
|
|
|
77
120
|
|
|
78
121
|
Todos os componentes de host aceitam `src` no lugar de `name`.
|
|
79
122
|
|
|
123
|
+
## Rodar local
|
|
124
|
+
|
|
125
|
+
Cada remote roda no próprio `vite dev`, numa porta. O host aponta para essas portas:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
cd carrinho && npm run dev # vite --port 5174
|
|
129
|
+
cd busca && npm run dev # vite --port 5175
|
|
130
|
+
cd loja && npm run dev # vite --port 3000
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
// loja/public/remotes.json
|
|
135
|
+
{
|
|
136
|
+
"carrinho": "http://localhost:5174/vitral.json",
|
|
137
|
+
"busca": "http://localhost:5175/vitral.json"
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```js
|
|
142
|
+
// loja/src/main.jsx
|
|
143
|
+
configure({ remotes: '/remotes.json' })
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Editar o remote atualiza o host sem recarregar a página (HMR). Para rodar só um remote local e pegar os outros de homologação, abra o host com `?vitral=carrinho@http://localhost:5174`.
|
|
147
|
+
|
|
148
|
+
## Docker e Kubernetes
|
|
149
|
+
|
|
150
|
+
Cada remote vira uma imagem nginx com o `dist`. O host lê a lista de remotes de uma variável de ambiente quando o contêiner sobe, então a mesma imagem serve em qualquer ambiente.
|
|
151
|
+
|
|
152
|
+
```yaml
|
|
153
|
+
# compose.yaml
|
|
154
|
+
services:
|
|
155
|
+
loja: # host: http://localhost:8080
|
|
156
|
+
build: ./loja
|
|
157
|
+
ports: ["8080:80"]
|
|
158
|
+
environment:
|
|
159
|
+
VITRAL_REMOTES: '{"carrinho":"/mf/carrinho/vitral.json","busca":"/mf/busca/vitral.json"}'
|
|
160
|
+
carrinho: # remote React
|
|
161
|
+
build: ./carrinho
|
|
162
|
+
busca: # remote Vue
|
|
163
|
+
build: ./busca
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
O nginx do host repassa `/mf/carrinho/` para o contêiner `carrinho`. Tudo fica na mesma origem: sem CORS e com uma porta só. Parar o contêiner `carrinho` mostra o erro só no lugar do carrinho.
|
|
167
|
+
|
|
168
|
+
No Kubernetes, as mesmas imagens funcionam com um Service por remote; o Ingress pode fazer o papel do nginx do host. Se os remotes ficam num CDN, troque `VITRAL_REMOTES` pelas URLs do CDN.
|
|
169
|
+
|
|
170
|
+
Exemplo completo, com Dockerfiles e configuração do nginx: [`examples/docker`](https://github.com/joaogabriel15/vitral/tree/main/examples/docker).
|
|
171
|
+
|
|
80
172
|
## Frameworks
|
|
81
173
|
|
|
82
174
|
| Framework | Remote | Host | Import |
|
|
@@ -340,19 +432,8 @@ expect(carrinho.lastProps).toEqual({ itens: 2 })
|
|
|
340
432
|
failingRemote('recomendacoes') // testa a tela de erro
|
|
341
433
|
```
|
|
342
434
|
|
|
343
|
-
## Comparado com Module Federation e single-spa
|
|
344
|
-
|
|
345
|
-
| | Module Federation / single-spa | vitral |
|
|
346
|
-
|---|---|---|
|
|
347
|
-
| Build do host | Config combinada com cada remote | Nenhuma. Só `configure()` |
|
|
348
|
-
| Versões de React/Vue | `shared` e singletons, conflitos de versão | Cada remote leva a sua. Compartilhar é opcional |
|
|
349
|
-
| Remote fora do ar | Pode derrubar a página | Só aquele remote mostra erro |
|
|
350
|
-
| CSS | Vaza entre apps | Escopo automático ou Shadow DOM |
|
|
351
|
-
| Deploy novo | `ChunkLoadError` com cache velho | Arquivos com hash; só o `vitral.json` revalida |
|
|
352
|
-
| Conceitos | Containers, exposes, lifecycles, root config | `mount(el, props, ctx)` → `{ update, unmount }` |
|
|
353
|
-
|
|
354
435
|
## Links
|
|
355
436
|
|
|
356
437
|
- [Exemplos](https://github.com/joaogabriel15/vitral/tree/main/examples): o mesmo remote em 8 frameworks e 9 hosts.
|
|
357
438
|
- [Como contribuir](https://github.com/joaogabriel15/vitral/blob/main/CONTRIBUTING.md)
|
|
358
|
-
- Licença [MIT](https://github.com/joaogabriel15/vitral/blob/main/LICENSE)
|
|
439
|
+
- Licença [MIT](https://github.com/joaogabriel15/vitral/blob/main/LICENSE). Feito por [Pacheco Codes](https://pacheco.dev.br/).
|
package/dist/vue.d.ts
CHANGED
|
@@ -127,8 +127,8 @@ declare const VitralRemote: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
127
127
|
onError?: ((...args: any[]) => any) | undefined;
|
|
128
128
|
onReady?: ((...args: any[]) => any) | undefined;
|
|
129
129
|
}>, {
|
|
130
|
-
name: string;
|
|
131
130
|
isolate: Isolation;
|
|
131
|
+
name: string;
|
|
132
132
|
priority: RequestPriority;
|
|
133
133
|
loading: Loading;
|
|
134
134
|
src: string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vitral",
|
|
3
|
-
"version": "0.7.
|
|
4
|
-
"description": "Micro-frontends
|
|
3
|
+
"version": "0.7.2",
|
|
4
|
+
"description": "Micro-frontends de qualquer framework numa página só, sem configuração de build no host. React, Next, Vue, Nuxt, Angular, Svelte, Solid, Preact, Lit e JS puro.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"micro-frontend",
|
|
7
7
|
"micro-frontends",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"web-components",
|
|
30
30
|
"typescript"
|
|
31
31
|
],
|
|
32
|
-
"homepage": "https://github.
|
|
32
|
+
"homepage": "https://joaogabriel15.github.io/vitral/",
|
|
33
33
|
"bugs": {
|
|
34
34
|
"url": "https://github.com/joaogabriel15/vitral/issues"
|
|
35
35
|
},
|