Frontends com Vibecoding · Capítulo 22 de 30 · 17 min
Planejar a modernização e publicar com reversão
Você sai com uma entrega que integra ondas, revisão, portões e retorno à versão anterior.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding. Para marcar como concluído e salvar o progresso, abra este capítulo na página do curso.
Um site que quebra em produção volta ao ar em segundos com um clique de rollback, não numa madrugada de conserto. A hospedagem guarda cada publicação como um arquivo pronto e promove a versão anterior de volta à principal. Esse clique só existe porque um comando único já barrou o defeito antes do envio, dentro de uma esteira que repete essa checagem sozinha a cada proposta.
O assistente de inteligência artificial que escreve código a partir do seu pedido (o agente) devolve trabalho com falhas previsíveis quando ninguém checa antes de publicar: tipo frouxo, aviso ignorado, nenhum teste. O roteiro que faz esse mesmo agente testar a tela como um usuário fecha o último buraco que a checagem automática não vê.
Encadeie a checagem de tipos, o padrão de código (a revisão automática de estilo, como o corretor ortográfico) e os testes num comando só, chamado verify, e rode-o antes de todo envio. Mire dez segundos: portão lento é portão que alguém pula na sexta-feira apertada, e portão pulado não protege ninguém. Encadeie os passos para que o primeiro que falhar impeça os seguintes.
As ferramentas por trás desse comando mudaram em 2026. O Vite 8 com Rolldown 1.0 é o empacotador de motor único, estável desde março e maio de 2026. Empacotador é a ferramenta que junta os arquivos do site num pacote leve, como embalar o produto antes do envio.
O ganho é de cerca de 25 vezes em 19 mil módulos e de duas a cinco vezes num projeto pequeno. No Next.js 16 o Turbopack é padrão desde 21 de outubro de 2025, com a ressalva da configuração webpack complexa, que pede o Rspack 2.2. No padrão de código, o Biome 2.3+ traz mais de 423 regras e lê tipos sem o compilador completo.
Fora do Tailwind (as classes utilitárias de estilo), o CSS passa pelo Lightning CSS. O Storybook 10, só ESM e 29% menor, é o catálogo onde cada componente (a peça reutilizada, como o botão) é testado sozinho.
Os testes seguem a lógica de portão em degraus. O Vitest roda os testes de unidade em segundos. O Playwright abre o navegador de verdade para o teste de ponta a ponta e compara a foto do SVG compilado entre duas propostas. É o que pega o gráfico que sumiu sem ninguém tocar nele.
Dentro do Playwright, o axe-core é o portão de acessibilidade. Ele cobre de 30% a 40% dos critérios de sucesso e move também o relatório do Lighthouse e o painel do Chrome, o que explica resultados iguais em ferramentas que parecem independentes. O resto é revisão humana, com Pa11y e Lighthouse CI fechando o degrau. O MSW simula o dado que viria da rede, para o teste não depender do servidor.
Build e qualidade em 2026: o que cada ferramenta faz e quando entra
| Ferramenta | O que faz | Quando entra |
|---|---|---|
| Vite 8 + Rolldown 1.0 | Empacota o site com um motor só, em Rust; linha 8.2, na 8.2.2 de 20/08/2026 | Projeto novo ou Vite antigo; até 25 vezes mais rápido em 19 mil módulos |
| Turbopack | Empacotador padrão do Next.js 16 desde 21/10/2025; sem pacote próprio, vai junto do Next.js (16.3.4, de 31/08/2026, com cache de build desde a 16.3) | Quem está no Next.js 16, salvo configuração webpack complexa |
| Rspack 2.2 | Empacotador compatível com configuração webpack | Projeto webpack grande sem reescrever a configuração |
| Biome 2.3+ | Padrão de código e formatação, mais de 423 regras | No lugar de ESLint e Prettier |
| Lightning CSS | Compila e minifica o CSS fora do Tailwind | CSS próprio fora do utilitário |
| Storybook 10 | Catálogo de componentes e teste visual; só ESM, 29% menor | Componente que se repete em várias telas |
| Vitest | Roda os testes de unidade | Todo projeto; é o runner do `verify` |
| Playwright | Ponta a ponta e foto do SVG compilado entre propostas | Fluxo com clique, formulário ou gráfico; Chromium fixo em CI |
| axe-core + Playwright | Portão de acessibilidade na esteira; é o mesmo motor do Lighthouse e do painel do Chrome | Todo projeto; cobre de 30% a 40% dos critérios de sucesso |
| Pa11y e Lighthouse CI | Auditoria de acessibilidade e orçamento de peso e tempo | Bloqueia a publicação quando o orçamento estoura |
| MSW | Simula o dado que viria da rede | Teste de tela com dado assíncrono, sem servidor de pé |
| Sharp, Squoosh e SVGO | Imagem em AVIF ou WebP e vetor limpo, no build | Todo projeto com imagem própria |
A coluna da direita é o critério para a ferramenta entrar.
Fonte: Manual de referência Recursos de frontend moderno, edição setembro de 2026, seção 23.
Rodar a checagem só na sua máquina é frágil: você esquece, ou o que passa no seu notebook falha em outro. O GitHub Actions é a esteira que vem com o repositório e roda os mesmos comandos numa máquina limpa a cada proposta. O arquivo diz a ordem: instalar as dependências travadas, rodar o verify e o build.
Um portão só protege quando bloqueia. Sem a proteção do ramo principal ligada, a checagem só avisa, e aviso ignorado não impede nada de entrar.
Fixe a versão do Chromium que a esteira usa: atualização de motor muda paginação e fonte. Dispare o PDF ou a foto só após um marcador de estado estável, nunca no evento de carregamento: tela que ainda espera dado gera arquivo pela metade.
A chave que autoriza publicar nunca entra no repositório. Se ela já foi enviada num commit, apagar o arquivo não resolve, porque o histórico a preserva; o conserto é trocar a chave no provedor. A esteira concentra credenciais de todos os ambientes: num levantamento de 2026, 59% das máquinas comprometidas eram executores de checagem.
A Vercel (a hospedagem que pega o repositório e publica a cada envio) guarda cada publicação como um arquivo pronto. Promova a anterior de volta à principal e o site volta à versão de ontem em segundos: um susto de cinco minutos em vez de uma madrugada.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O último portão é o agente testando a tela como usuário. A skill webapp-testing (o roteiro que ensina o agente a testar a aplicação local com Playwright em Python) fixa a ordem: reconhecer antes de agir.
O ajudante with_server.py sobe o servidor e roda o script; rode --help antes e trate os scripts como caixa-preta, porque a fonte deles polui a conversa. Para HTML estático, o agente lê o arquivo e acha os seletores (o endereço de cada elemento, por texto, papel, CSS ou id).
Para aplicação dinâmica, ele sobe o servidor, navega e espera a rede sossegar. Só então tira o print ou inspeciona o DOM (a árvore de elementos da página) e escolhe os seletores. Inspecionar o DOM antes de a rede sossegar é a armadilha: o seletor mira o que ainda não existe. Chromium sempre sem janela, navegador fechado no fim.
# testar_frete.py: o agente testa a tela como usuário, reconhecendo antes de agir.
# Rode pelo ajudante da skill (peça --help antes de usar):
# python scripts/with_server.py --server "npm run dev" --port 5173 -- python testar_frete.py
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
navegador = p.chromium.launch(headless=True) # sempre sem janela
pagina = navegador.new_page(viewport={"width": 390, "height": 844})
pagina.goto("http://localhost:5173/carrinho")
pagina.wait_for_load_state("networkidle") # a rede sossegou: só agora olhe o DOM
pagina.screenshot(path="carrinho-antes.png", full_page=True)
# seletores escolhidos no estado renderizado: por texto, papel, CSS ou id
pagina.get_by_label("CEP").fill("01310-100")
pagina.get_by_role("button", name="Calcular frete").click()
pagina.wait_for_load_state("networkidle")
valor = pagina.get_by_test_id("valor-frete").inner_text()
pagina.screenshot(path="carrinho-depois.png", full_page=True)
assert valor.strip() != "", "a caixa do frete veio vazia"
navegador.close() # feche o navegador no fimUm envio com erro de tipo que derruba o cálculo do frete não chega ao site quando o verify bloqueia a entrada na esteira. O roteiro do agente fotografa a caixa vazia no mesmo dia.
Antes de aprovar a próxima publicação, peça o verify encadeado como condição obrigatória na esteira. Trave a versão do Chromium que ela usa e confirme que a chave de publicação mora no cofre da plataforma, nunca no repositório. Rode o roteiro Playwright que testa a tela como o cliente vê e só aprove o envio quando ele passar com a rede sossegada.
Modernizar em cinco ondas, com dois agentes sem se atropelar
Cinco ondas com um portão de verificação entre uma e a próxima modernizam um site antigo sem parar de atender e sem quebrar tudo ao mesmo tempo. A ordem protege o negócio: medição primeiro, depois o caminho do cliente, o visual, o movimento e por último o desempenho, cada onda fechada antes de a seguinte começar.
A pasta separada para cada agente (o assistente de inteligência artificial que escreve código a partir do seu pedido) evita que um apague o trabalho do outro dentro da mesma onda. A onda zero fixa a régua antes de qualquer mudança, e a matriz do manual escolhe a stack de destino pelo cenário do relatório.
Cada onda (uma rodada de trabalho com um único objetivo, fechada por uma checagem antes de a próxima começar) cuida de uma camada só. Atacar as frentes juntas produz, semanas depois, a mesma lista de problemas com coisas quebradas em cima.
A primeira onda só mede: nenhum arquivo muda, e o resultado é um relatório com três números de partida. Entre uma onda e a próxima existe o portão de qualidade (a checagem automática que barra a mudança ruim antes do cliente). Se ele reprova, a onda volta e corrige, e o programa pode parar no meio sem perder o entregue.
Antes da primeira onda existe a onda zero, que fixa a régua com que as outras serão medidas. Ela tem três peças. O orçamento de desempenho é o teto de peso e de tempo de carregamento escrito antes de qualquer tela, como o orçamento da obra antes do primeiro tijolo.
O profiling mede onde o tempo é gasto; o OpenTelemetry é o padrão aberto que registra o que a tela faz em produção, como o odômetro do carro. Produto visual sem esse controle desde a primeira semana degrada em silêncio. Sem a onda zero, a onda cinco chega sem saber se o site ficou mais rápido ou apenas diferente.
Um teto numérico orienta o agente melhor do que "deixe leve". O portão de cada onda compara o número medido com o teto da onda zero.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A stack de destino (o conjunto de ferramentas que constrói e serve a tela) depende do cenário, e a matriz do manual decide numa linha. O board mensal fechado (o relatório da reunião de conselho) pede HTML estático com D3 ou Observable Plot e CSS de impressão.
O investor update pede Astro 7 com MDX e PDF via Playwright. O marketing diário pede React ou Vue com ECharts, Plotly ou ApexCharts 7, ligados às APIs (as portas de dados). O portal recorrente para diretoria pede Next.js 16 ou Astro com camada semântica (a definição de cada métrica em código versionado) e controle de acesso por linha.
O relatório offline seguro cabe num HTML único com DuckDB-Wasm e dados locais; a prova de conformidade pede Typst 0.15. Site que atende dois cenários recebe duas ondas de visual, uma por stack de destino, em vez de uma stack de compromisso que serve mal aos dois.
A matriz decisória: o cenário do relatório escolhe a stack de destino da onda
| Cenário | Stack de destino |
|---|---|
| Board mensal fechado | HTML estático + D3 ou Observable Plot + CSS de impressão |
| Investor update | Astro 7 + MDX + D3 ou ECharts + PDF via Playwright |
| Marketing performance diária | React ou Vue + ECharts, Plotly ou ApexCharts 7 + APIs |
| Growth self-service | Looker, Power BI ou Tableau embutido com camada narrativa |
| MMM e incrementalidade | Python ou R + Meridian ou Robyn + Plotly ou Vega + export HTML |
| Geomarketing | deck.gl 9.3 + MapLibre v6 + Kepler.gl |
| SaaS B2B analytics | React ou Svelte + BI headless (Cube + dbt) + visx ou D3 |
| Relatório offline seguro | HTML único + DuckDB-Wasm ou SQLite Wasm + dados locais |
| Portal C-level recorrente | Next.js 16 ou Astro + camada semântica + autenticação e RLS |
| Relatório com prova de conformidade | Typst 0.15 (PDF/UA-1 e PDF/A-2a no mesmo arquivo) |
| Editor colaborativo de fluxograma | React ou Solid + JointJS ou GoJS + Konva ou PixiJS + Yjs + WASM cirúrgico |
| Planilha embutida no produto | Univer (ou Fortune-sheet em migração de Luckysheet) |
Escolha a linha pelo cenário do relatório; a onda do visual mira essa stack.
Fonte: Manual de referência Recursos de frontend moderno, edição setembro de 2026, seção 26.
Dentro de uma onda, dois agentes trabalham juntos desde que cada um tenha a própria pasta e a própria lista de arquivos. O git worktree (um comando do próprio git que cria uma segunda pasta de trabalho ligada ao mesmo repositório) faz a pasta. Cada uma fica no seu ramo e as duas dividem o mesmo histórico, sem duplicar código.
Pasta separada evita a sobrescrita; o escopo disjunto (a lista de arquivos que é só de um agente) evita o conflito na hora de juntar. Se dois agentes citam o mesmo arquivo, o recorte foi mal feito, mesmo com pastas diferentes. Quem precisa de algo fora do próprio escopo relata o que falta, em vez de editar por conta própria.
Escreva o pedido único com a onda zero embutida: descreva o site atual, fixe o teto de tempo e peso e a medição em produção. Peça as cinco ondas na ordem, com o seu aprovado entre uma e a próxima. Para dividir uma onda entre dois agentes, crie uma pasta irmã por ramo com o git worktree, dê a cada uma sua lista de arquivos e incorpore um ramo de cada vez ao final.
Todos os capítulos de Frontends com Vibecoding
- 01Projetar o briefing, o repertório da marca e o custo de manter
- 02Dirigir o prompt e avaliar a entrega do agente
- 03Escolher a stack e projetar suas dependências
- 04Investigar uma stack e priorizar atualizações
- 05Construir a identidade com tokens, CSS moderno e DESIGN.md
- 06Construir componentes, usar o registro e publicar o catálogo
- 07Projetar uma linguagem de ícones e ilustração
- 08Projetar menus, popovers e modais acessíveis
- 09Adaptar o layout ao celular e ao contêiner
- 10Projetar movimento, assinatura e narrativas por rolagem
- 11Preparar imagens, ícones e vídeo para a web
- 12Construir profundidade e dirigir a montagem de vídeo
- 13Construir formulários e estados de interação
- 14Publicar conteúdo encontrável em vários idiomas
- 15Projetar gráficos e painéis pela decisão
- 16Dimensionar tabelas e organizar o cálculo das métricas
- 17Escolher mapas, diagramas e cenas espaciais
- 18Comparar direção visual em Stripe e Apple
- 19Avaliar busca, conversão e padrões de comércio
- 20Auditar acessibilidade e contraste nos dois temas
- 21Validar desempenho, autenticação e segurança
- 22Planejar a modernização e publicar com reversão
- 23Construir o projeto final, medir a cara de IA e revisar
- 24Comparar modelos e interpretar benchmarks
- 25Calcular custo por tarefa e definir governança
- 26Supervisionar o modelo que opera o computador
- 27Configurar ambiente, skills e o contêiner de contexto
- 28Aplicar direção de arte, UX writing e padrões de código
- 29Construir um aplicativo instalável e resiliente
- 30Produzir apresentações e PDF com critérios de entrega