Frontends com Vibecoding · Capítulo 22 de 33 · 32 min
Planejar a modernização e publicar com reversão
A modernização sai em cinco ondas com portão entre elas, orçamento fixado na onda zero e caminho de volta à versão anterior pronto antes da publicação.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding.
Um site que quebra em produção volta ao ar em segundos, com um clique de reversão. A hospedagem guarda cada publicação como um arquivo pronto, e por isso consegue promover a versão anterior de volta à principal.
Esse clique só existe porque um comando único barrou o defeito antes do envio. E o comando não depende da sua memória: uma esteira automática repete a mesma checagem a cada proposta de mudança.
O agente, o assistente de inteligência artificial que escreve código a partir do seu pedido, devolve trabalho com falhas previsíveis. Quando ninguém checa antes de publicar, são sempre as mesmas: tipo frouxo, aviso ignorado, nenhum teste.
Publicar é pôr a nova versão no ar para o cliente, e o defeito que escapa até ali já custa venda. O roteiro que faz o agente testar a tela como usuário fecha o buraco que a checagem automática não vê.
Encadeie três checagens num comando só, chamado verify, e rode-o antes de todo envio. São elas: 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.
Mire dez segundos de espera. Portão lento é portão que alguém pula na sexta-feira apertada, e portão pulado não protege ninguém. Ordene os passos para que o primeiro que falhar impeça os seguintes.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
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 num projeto de 19 mil módulos, e de duas a cinco vezes num projeto pequeno. Quem já está no Next.js 16 não escolhe: o Turbopack vem como padrão, salvo se a configuração antiga for complicada, caso em que o Rspack serve.
No padrão de código, o Biome substitui duas ferramentas antigas e lê tipos sem rodar o compilador completo. Fora do Tailwind (as classes utilitárias de estilo), o CSS passa pelo Lightning CSS.
O Storybook 10 é o catálogo onde cada componente (a peça reutilizada, como o botão) é testado sozinho, fora da tela em que ele aparece.
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.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Dentro do Playwright, o axe-core é o portão de acessibilidade, a checagem de que a tela serve a quem usa leitor de tela ou só o teclado. Ele cobre de 30% a 40% dos critérios de sucesso, e o resto continua sendo revisão humana.
Esse mesmo motor move o relatório do Lighthouse e o painel do Chrome. Por isso ferramentas que parecem independentes devolvem o mesmo resultado. Pa11y e Lighthouse CI fecham o degrau, e 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.
Na Vercel (a hospedagem que pega o repositório e publica a cada envio), cada publicação fica guardada 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.
Use o ajudante with_server.py para subir o servidor e rodar 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.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
# 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.
Depois rode o roteiro Playwright que testa a tela como o cliente vê. Só aprove o envio quando ele passar com a rede já sossegada.
Modernizar um sistema antigo por etapas, sem parar de atender
Com os portões automatizados, a modernização de um site existente pode ser fatiada em ondas, com orçamento fixado antes da primeira e dois agentes em pastas separadas.
Cinco ondas de melhoria, com um portão de verificação entre uma e a próxima, modernizam um site antigo sem parar de atender. Onda é uma rodada de trabalho com um objetivo só, fechada por uma checagem.
A ordem protege o negócio: primeiro a medição, depois o caminho do cliente, o visual, o movimento e o desempenho. Cada onda fecha antes de a seguinte começar.
Cada agente é um assistente de inteligência artificial que escreve código a partir do seu pedido. Dê a cada um a sua própria pasta, e nenhum apaga 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.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Uma onda cuida de uma camada só, e nada mais. 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.
Já 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 um pedido único com a onda zero embutida: descreva o site atual, fixe o teto de tempo e de peso e diga onde a medição entra. 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 agente sua lista de arquivos e incorpore um ramo de cada vez ao final.
Guia prático: teste A/B do topo da landing page com Vercel Flags
Teste A/B mostra duas versões da mesma página a públicos sorteados e compara o resultado. Feito por script no navegador, ele troca o conteúdo depois que a página aparece, e a Vercel registra que isso piora LCP e CLS justamente na página testada. Com uma flag avaliada no servidor, cada visitante recebe a versão dele já pronta.
Flag é a chave que liga ou desliga um trecho da página sem nova publicação. A documentação do Vercel Flags, atualizada em 15 de setembro de 2026, cobre o ciclo inteiro pelo terminal: criar a flag com as variantes, definir no código com o Flags SDK, enviar o valor ao Web Analytics, dividir o tráfego no painel e arquivar ao final. A integração com o Web Analytics está em beta, em todos os planos.
O portão verify e a reversão de um clique deste capítulo continuam sendo a rede de proteção: a variante nova só entra no ar depois de passar por eles.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Responsável por aquisição de uma plataforma de cursos online, com tráfego pago para a página de matrícula
Educação online, matrícula por formulário
Dor
O time discutia há um mês se o topo devia abrir com o preço ou com o depoimento de um aluno. Cada troca era feita na página inteira, e ninguém sabia separar o efeito do topo do efeito da semana.
Solução
Ela escreveu a hipótese e a métrica antes de começar, criou uma flag com duas variantes e pediu ao agente as duas versões do topo no mesmo componente. Conferiu as duas na prévia e dividiu o tráfego de produção ao meio.
Resultado
As duas versões rodaram no mesmo período, com o evento de matrícula iniciada separado por variante. A decisão ficou marcada para a data combinada, e a flag foi arquivada em seguida.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Teste A/B no servidor, da hipótese ao arquivamento da flag
Oito passos, com os comandos da documentação. Um teste, uma variável, uma métrica e uma data de decisão escritas antes.
Passo 1: Escreva hipótese, métrica e data antes do código
Uma frase: trocar o topo de preço para depoimento aumenta os envios do formulário. Defina o evento que decide, o tamanho mínimo de amostra e o dia de ler.
Deu certo quando: O documento do teste existe antes da flag e diz o que acontece com cada resultado.
Erro comum: Testar título, imagem e botão juntos e não saber qual deles mudou o número.
Passo 2: Crie a flag com as duas variantes
vercel flags create hero-campanha --kind string --variant control="Topo atual" --variant treatment="Topo com depoimento". Antes, rode vercel link e vercel env pull para a credencial local.
Deu certo quando: A flag aparece na seção Flags do projeto, com as duas variantes.
Erro comum: Criar uma flag por variação e acabar com combinações que ninguém planejou.
Passo 3: Defina a flag no código com o Flags SDK
npm i flags @flags-sdk/vercel. No arquivo flags.ts, a função flag recebe a chave e o vercelAdapter. No componente de servidor da página, o valor escolhe qual topo renderizar.
Deu certo quando: A página devolve o topo certo já no HTML, sem troca visível depois do carregamento.
Erro comum: Decidir a variante num efeito do navegador e criar o salto de layout que o teste deveria evitar.
Passo 4: Envie o valor da flag ao Web Analytics
Coloque o componente FlagValues, de flags/react, no layout raiz. No envio aceito do formulário, registre o evento com track, do pacote @vercel/analytics, e a opção flags com a chave do teste.
Deu certo quando: No Web Analytics, visitas e eventos aparecem separados por variante.
Erro comum: Medir só visualização de página e decidir sem o evento que representa a conversão.
Passo 5: Confira as duas variantes na prévia
vercel deploy e, em seguida, vercel flags set hero-campanha --environment preview --variant treatment. Repita com control. Peça os prints de celular e computador de cada uma.
Deu certo quando: As duas versões passam no verify, abrem na URL de prévia e enviam o formulário.
Erro comum: Publicar a variante nova sem nunca tê-la visto no celular.
Passo 6: Divida o tráfego de produção no painel
vercel flags open hero-campanha abre a flag. Configure a regra que divide o tráfego entre control e treatment e publique com vercel deploy --prod.
Deu certo quando: A mesma pessoa vê sempre a mesma versão, e as duas recebem tráfego no mesmo período.
Erro comum: Rodar uma versão numa semana e outra na seguinte, comparando campanhas e feriados diferentes.
Passo 7: Leia só na data combinada
Compare o evento de conversão por variante no Web Analytics, com a amostra mínima atingida. Diferença pequena com pouca visita é ruído.
Deu certo quando: A decisão sai do documento do teste: manter, trocar ou repetir com mais tráfego.
Erro comum: Espiar todo dia e encerrar no primeiro dia em que a variante preferida aparece na frente.
Passo 8: Remova a flag do código e arquive
Deixe só o topo vencedor no componente e rode vercel flags archive hero-campanha --yes. Se a versão vencedora der problema, a reversão de um clique deste capítulo continua disponível.
Deu certo quando: O código volta a ter um caminho só e a lista de flags não guarda teste encerrado.
Erro comum: Deixar a flag viva por meses e carregar duas versões do topo que ninguém mais mantém.
No fim você tem: Um teste A/B decidido no servidor, com conversão medida por variante, uma decisão datada e a flag arquivada ao final.
Guia prático: piloto pequeno, refazer só o que mudou e checklist antes de publicar
O curso de edição de vídeo estudado em 07/10/2026 trabalha com três hábitos que servem igual a uma página. O primeiro é o piloto: vídeo acima de 5 minutos começa pelos 3 primeiros, e o longo, por 60 a 90 segundos em resolução menor. No caso real, os 3 minutos viraram 48 segundos editados e, só depois de aprovados, o método foi aplicado ao resto. A regra do material: erro no piloto custa minutos; no final, horas.
O segundo é refazer só o que mudou. O vídeo longo é montado por capítulos, e a revisão manda renderizar só os capítulos alterados. Na página, o equivalente é corrigir uma seção sem mexer nas outras e conferir só o que a mudança tocou.
O terceiro é o checklist antes de publicar. A skill do curso tem 10 itens antes de declarar pronto, e o roteiro de publicação no YouTube tem 9, abrindo com uma frase que vale para qualquer entrega: o agente edita, mas quem assina é você. O arquivo final tem nome que o identifica, e não há dúvida sobre qual versão sobe.
Checklist antes de publicar a página [NOME DA PÁGINA]
[ ] Abri a página inteira no celular (390 px) e no computador, do topo ao rodapé.
[ ] Todo número, nome, logo e depoimento na tela foi dito ou aprovado por mim.
[ ] Telefone, WhatsApp e e-mail levam ao contato certo; testei um de cada.
[ ] Nenhum link vazio, nenhum texto de exemplo, nenhum registro profissional fictício.
[ ] O formulário ou o botão de contato funciona no endereço de produção.
[ ] Título e descrição da página estão em português e falam do que ela oferece.
[ ] Com movimento reduzido ligado, tudo aparece parado e legível.
[ ] O comando de verificação passou e a pré-visualização é a mesma versão que vai ao ar.
[ ] Existe a página, o material ou o cupom que a página promete.
[ ] Sei qual versão anterior volta se algo der errado.Do piloto à publicação sem retrabalho
Cinco passos para a próxima página que você publicar.
Passo 1: Faça o piloto de uma seção
Peça só o topo com o design system completo: cores, fontes, botão e movimento. Abra no celular e no computador e aprove antes de pedir o resto.
Deu certo quando: O topo aprovado vira o padrão que as outras seções copiam.
Erro comum: Pedir a página inteira de uma vez e corrigir o mesmo erro em oito seções.
Passo 2: Junte as correções numa lista só
Revise a seção inteira antes de pedir mudanças e mande todas juntas, uma por linha, com o lugar e o que quer ver. O agente refaz uma vez em vez de cinco.
Deu certo quando: Cada rodada de ajuste sai de uma única mensagem.
Erro comum: Mandar uma correção por mensagem e ver a terceira desfazer a primeira.
Passo 3: Peça para refazer só o que mudou
Ao corrigir, diga quais seções podem ser tocadas e quais ficam como estão. Peça a lista de arquivos alterados para conferir que nada fora do pedido mudou.
Deu certo quando: A lista de arquivos alterados bate com as seções do pedido.
Erro comum: Aceitar uma correção de texto que também mudou o espaçamento de outra seção.
Passo 4: Passe o checklist do bloco acima
Ajuste os dez itens ao seu negócio e guarde o arquivo no projeto. Marque cada item olhando a página, não a conversa.
Deu certo quando: Os dez itens estão marcados, com a data, antes de publicar.
Erro comum: Marcar o checklist de memória, sem abrir a página no celular.
Passo 5: Identifique a versão que sobe
Anote o endereço da pré-visualização aprovada e o código da versão. A versão publicada é essa, e não uma refeita depois da aprovação.
Deu certo quando: Você sabe dizer qual versão está no ar e qual volta se for preciso.
Erro comum: Aprovar uma pré-visualização e publicar outra que o agente gerou depois.
No fim você tem: Uma página aprovada em piloto, corrigida em rodadas únicas e publicada com checklist marcado e versão identificada.
Guia prático: portões que seguram a publicação, da proposta ao tráfego real
A aula montou o comando verify e a esteira do GitHub Actions. Depois do merge ainda há três momentos em que a versão nova pode parar: antes de o build começar, antes de ir para o domínio e enquanto recebe só uma fração das visitas. Você sai com asserções do Lighthouse CI que reprovam, uma linha de base que só desce e a liberação gradual da Vercel para a campanha grande.
Funções, casos de uso e aplicações
Funções
Os portões entre o merge e o tráfego real
| Função ou recurso | O que faz | Quando usar | Referência |
|---|---|---|---|
| Asserções do Lighthouse CI (error e warn) | error reprova a esteira; warn só avisa. minScore vale para nota, maxNumericValue para tempo | Nota de acessibilidade, CLS e LCP que não podem piorar | Lighthouse CI, documentação de configuração |
| aggregationMethod | Junta várias rodadas pela mediana, pela mais otimista, pela mais pessimista ou pela rodada mais típica | Sempre que rodar mais de uma vez, para a variação do laboratório não decidir sozinha | Lighthouse CI |
| assertMatrix | Aplica regras diferentes por padrão de endereço | Home leve com teto estrito e página de curso pesada com teto próprio | Lighthouse CI |
| Ignored Build Step | Comando que sai com 0 para cancelar o build e 1 para seguir; o build cancelado conta na cota da Vercel | Commit que só muda documentação | Vercel, página atualizada em 21/09/2026 |
| Deployment Checks | Segura o deploy de produção fora do domínio até as checagens do GitHub Actions passarem | Quando o merge vai direto ao ar e o teste de ponta a ponta roda depois | Vercel, página atualizada em 11/08/2026 |
| Rolling Releases | Manda uma fração das visitas (por exemplo, 5%) para a versão nova e compara métricas com a anterior | Lançamento de campanha grande; o plano Pro inclui o recurso em um só projeto | Vercel, página atualizada em 15/09/2026 |
| Linha de base que só desce | Aceita a dívida antiga registrada e reprova só quando piora | Projeto com acervo antigo que não passa no limite novo | Portal, scripts/gate-peso-visual.mjs |
Casos de uso
Head de growth de uma edtech de cursos preparatórios em São Paulo
Educação
Dor
Na Black Friday, uma versão nova da página de matrícula subiu com o botão de pagamento fora da tela no celular e ficou no ar até alguém reclamar.
Solução
Ligou Deployment Checks com o teste de ponta a ponta do GitHub Actions e Rolling Releases em duas etapas, 10% e depois 100%, com Skew Protection para o navegador e o servidor da mesma versão conversarem.
Resultado
O que observar: na aba de Observability, Speed Insights e taxa de erro da versão nova contra a anterior durante a etapa de 10%, antes de avançar.
Custo apurado: Rolling Releases exige plano Pro ou Enterprise da Vercel.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Desenvolvedora de uma agência de marketing em Belém que mantém 40 landing pages de clientes
Marketing digital
Dor
Um teto único de desempenho reprovava metade das páginas antigas no primeiro dia, e o time desligou o portão.
Solução
Gravou a nota atual de cada página num arquivo de linha de base, com o portão reprovando só queda abaixo dela, e regras por endereço com assertMatrix.
Resultado
O que observar: o portão fica ligado, e a linha de base de cada página só desce de mês a mês.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Na prática
Este portal usa os três momentos. Antes do build, vercel.json aponta o ignoreCommand para scripts/should-build.sh, que analisa primeiro os arquivos alterados e só depois o prefixo do commit, e cancela build de produção já superado por um commit mais novo. Na esteira, .github/workflows/ci-and-deploy.yml roda node scripts/gate-peso-visual.mjs --verificar-baseline, que lê scripts/peso-visual-baseline.json: curso novo cumpre o limite inteiro, e o acervo publicado só pode melhorar. O lighthouserc.json reprova acessibilidade, SEO e boas práticas abaixo de 90 e só avisa em desempenho.
"assert": {
"assertions": {
"categories:accessibility": ["error", { "minScore": 0.9 }],
"categories:performance": ["warn", { "minScore": 0.6 }],
"categories:best-practices": ["error", { "minScore": 0.9 }],
"categories:seo": ["error", { "minScore": 0.9 }],
"largest-contentful-paint": ["error", { "maxNumericValue": 4000 }],
"cumulative-layout-shift": ["error", { "maxNumericValue": 0.1 }],
"total-blocking-time": ["warn", { "maxNumericValue": 600 }]
}
}{
"ci": {
"collect": { "url": ["http://localhost:3000/", "http://localhost:3000/inscricao"], "numberOfRuns": 3 },
"assert": {
"assertMatrix": [
{
"matchingUrlPattern": ".*/$",
"assertions": {
"categories:accessibility": ["error", { "minScore": 0.95, "aggregationMethod": "median-run" }],
"largest-contentful-paint": ["error", { "maxNumericValue": 2500, "aggregationMethod": "median" }],
"cumulative-layout-shift": ["error", { "maxNumericValue": 0.1, "aggregationMethod": "median" }]
}
},
{
"matchingUrlPattern": ".*/inscricao$",
"assertions": {
"categories:accessibility": ["error", { "minScore": 0.95, "aggregationMethod": "median-run" }],
"largest-contentful-paint": ["warn", { "maxNumericValue": 3500, "aggregationMethod": "median" }]
}
}
]
}
}
}Do merge ao tráfego real, com três paradas
Passo 1: Corte o build que não precisa existir
Um Ignored Build Step que olha os arquivos alterados antes do prefixo do commit. Lembre que o build cancelado ainda conta na cota da Vercel.
Erro comum: Cancelar pelo prefixo chore: e deixar de publicar um arquivo de dados que o site serve.
Passo 2: Reprove o que não pode piorar
Acessibilidade, CLS e LCP como error no Lighthouse CI, com três rodadas e mediana. Desempenho geral pode começar como warn.
Deu certo quando: Uma proposta que empurra o botão para baixo reprova antes do merge.
Passo 3: Dívida antiga congelada numa linha de base
Grave a nota atual de cada página e deixe o portão reprovar só a queda. A linha desce quando alguém melhora.
Passo 4: Segure o deploy até o teste passar
Marque o job de ponta a ponta como Deployment Check. O deploy de produção fica pronto, mas fora do domínio até o check passar.
Passo 5: Na campanha grande, libere aos poucos
Rolling Releases com Skew Protection, compare as métricas da fração nova e avance ou volte com Instant Rollback.
Deu certo quando: A decisão de avançar sai de números das duas versões lado a lado.
No fim você tem: O defeito para no portão certo, e a versão nova enfrenta poucas visitas antes de enfrentar todas.
Armadilhas
Portões de publicação: o que evitar e o que pedir
Evitar
Coluna a evitar
- Teto absoluto que o site nunca atingiu e vira alarme diário
- Uma rodada só do Lighthouse decidindo a aprovação
- Cancelar build só pelo prefixo do commit
- vercel promote para iniciar a liberação gradual na esteira
- Liberação gradual sem Skew Protection
Recomendado
Coluna recomendada
- Linha de base por página que só desce
- Três rodadas com mediana
- Arquivos alterados decidem primeiro; prefixo por último
- vercel rolling-release start e complete
- Skew Protection ligada junto com Rolling Releases
Aplicar os recursos ao projeto
O teste acompanha a fronteira da dúvida
| Fronteira | Exemplo | Ferramenta possível |
|---|---|---|
| Função | Cálculo com entrada conhecida | Vitest |
| Componente | Ação pelo nome acessível | Testing Library |
| Navegador | Fluxo inteiro | Playwright |
| Pessoa | Entender e concluir tarefa | Revisão manual |
Escolher o teste pela falha que ele encontra evita repetir verificações sem aumentar a confiança no comportamento entregue.
Playwright é um robô que abre o navegador e repete o caminho do cliente: clica, digita, confere. Ele guarda os fluxos que não podem quebrar, como pedir orçamento. Vale quando uma falha ali custa dinheiro; o preço é manter os testes vivos a cada mudança.
No teste de orçamento, ache o botão por papel e nome com getByRole, o jeito de procurar pelo que a pessoa vê. Abra o formulário, preencha pelos rótulos, envie e espere a confirmação aparecer. Acrescente uma rodada com dado inválido, conferindo a mensagem e a chance de corrigir.
Espere por uma condição da tela, nunca por um tempo fixo, senão o teste falha sozinho em dia de rede lenta. Quando falhar, abra o rastro e a captura antes de aumentar a espera. Robô de navegador registra repetição; ele não ouve leitor de tela.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A Testing Library manda procurar na tela como um cliente procura: pelo rótulo do campo, pelo nome do botão, pelo papel da peça. Assim o teste para de depender de classe CSS. Adote para amarrar o teste ao que a pessoa vê; controles mal nomeados ficam difíceis de achar.
Renderize o formulário, ache o campo pelo rótulo e digite com user-event, a biblioteca que imita teclado e mouse de verdade. Acione o botão pelo nome dele e confira se o erro aparece quando falta um dado. Depois corrija o campo e veja a mensagem sumir.
Se você só consegue achar o botão por um identificador técnico, o problema é o nome acessível dele, e a correção mora no componente. Ambiente simulado não faz conta de layout, então rolagem, posição e foco visível pedem teste em navegador de verdade.
Vitest roda as provas pequenas do código: dada esta entrada, sai este resultado. Ele é rápido e cabe em regra isolada, como cálculo de frete ou filtro de busca. Use para travar decisão de negócio; ele não vê tela, então não responde se o botão aparece.
Na busca do catálogo, escreva um caso que procura palavra com acento e confere quais itens voltaram. Use expect para comparar o resultado com a lista esperada. Inclua uma busca vazia e outra sem resultado, deixando escrito o que o sistema faz em cada situação.
Confira em que ambiente a prova roda, porque Node, DOM imitado e navegador de verdade sabem coisas diferentes. Substitua por mentira só o que vem de fora, como chamada de rede. Suíte verde não diz que a tela está certa; rode a suíte antes de publicar.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- Gates do CI e deploy sem surpresasugerido pelo grafoApresenta os conceitos “Vercel” e “Deploy”, usados em “Planejar a modernização e publicar com reversão”.
- Anatomia de uma Skill: Divulgação Progressiva em Três Níveissugerido pelo grafoApresenta o conceito “Skill (Agent Skill)”, usado em “Planejar a modernização e publicar com reversão”.
- As linhas que ninguém orça: build, medição e logsugerido pelo grafoApresenta o conceito “Build”, usado em “Planejar a modernização e publicar com reversão”.
Depois, siga para
- CursoPrompt Engineering para Executivossugerido pelo grafo7 capítulos de “Prompt Engineering para Executivos” usam conceitos apresentados em “Frontends com Vibecoding”.
- CursoLLM FinOps: o custo da IA para quem assina o orçamentosugerido pelo grafo3 capítulos de “LLM FinOps: o custo da IA para quem assina o orçamento” usam conceitos apresentados em “Frontends com Vibecoding”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Vibecoding para SEOO Manifesto Vibecoding: Programe sem ProgramarExaminar conexões de O Manifesto Vibecoding: Programe sem Programar
- Bastidores: Como Este Portal Foi ConstruídoGates do CI e deploy sem surpresaExaminar conexões de Gates do CI e deploy sem surpresa
- SEO ProgramáticoTestar o template no pior caso e achar o tetoExaminar conexões de Testar o template no pior caso e achar o teto
- Software e IA para executivosDecidir o que roda no servidor e o que vai ao celularExaminar conexões de Decidir o que roda no servidor e o que vai ao celular
Voltar ao capítulo anterior: Validar desempenho, autenticação e segurança
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
Base UI
Prenda o foco num diálogo sem escrever o comportamento
Abra a janela Agendar visita, percorra os campos com Tab, feche com Esc e acompanhe no painel onde o foco está e para onde ele volta.
Pacote
Abrir no capítuloConstruir componentes, usar o registro e publicar o catálogo@base-ui/reactLucide e Iconify
Mantenha uma família de ícones coerente e nomeie cada botão
Mude tamanho, traço e cor da barra, veja o símbolo do Iconify acompanhar o Lucide e rode a auditoria de nomes acessíveis.
Pacote
Abrir no capítuloProjetar uma linguagem de ícones e ilustraçãolucide-react, @iconify/reactMotion
Testar os três sinais que autorizam o terceiro degrau
Reproduza a entrada em sequência, aperte o botão com mola e arraste o cartão; ajuste rigidez e amortecimento e veja o que muda.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagemmotionVidstack
Ver o que separa um player de um vídeo cru
Dê o play, troque a velocidade e ligue a legenda; o painel ao lado mostra o estado que o player publica e que a etiqueta crua esconde.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagem@vidstack/reactcmdk
Achar um destino entre quarenta digitando três letras
Abra a paleta, digite fat e escolha um item só pelo teclado; o painel embaixo conta o que o filtro deixou passar e quanto tempo levou.
Pacote
Abrir no capítuloConstruir formulários e estados de interaçãocmdknumber-flow
Animar indicadores que mudam ao vivo com formato pt-BR
Veja três indicadores fictícios rolarem a cada troca e compare com o número em texto puro. Pause, reinicie e observe o separador de milhar.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisão@number-flow/reactApache ECharts
Medir o custo de desenhar 200 mil pontos com o ECharts
Troque o tipo de gráfico e o volume de pontos, leia o tempo de desenho e alterne o eixo em zero. Mude o tema do site e veja as cores refazerem.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisãoechartssharp e svgo
Escolher a variante certa da imagem e conferir o teto de 150 KB
Arraste a largura da tela simulada, troque a densidade entre 1x e 2x e veja qual arquivo o navegador escolhe, quanto ele pesa e se cabe no orçamento.
Pacote
Abrir no capítuloValidar desempenho, autenticação e segurançasharp, svgoReact Flow (xyflow)
Disparar um pedido e ver o orquestrador distribuir, conferir e responder
Alterne paralelo e sequencial, ligue e desligue a verificação e use a medição real; observe o tempo de parede em cada combinação.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robô@xyflow/reactGSAP, Web Workers e number-flow
Dividir mil tarefas entre trabalhadores reais e correr três ritmos de geração
Execute com um trabalhador, depois com quatro e oito, e compare o tempo; em seguida percorra a corrida e separe a espera inicial do ritmo.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôgsap, @number-flow/reactThree.js com React Three Fiber, drei, Rapier e XR
Carregar o braço robótico, ver a física trabalhar e entrar na cena com o visor
Carregue a cena pelo botão, inicie o ciclo, mostre os ângulos das juntas, troque a câmera e a velocidade; com visor, entre em realidade virtual.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôthree, @react-three/fiber, @react-three/drei, @react-three/rapier, @react-three/xrMotion
Ver quatro agentes em raias trocando mensagens e a revisão devolvendo um trecho
Reproduza os 60 s de modelo, percorra o tempo pelo controle e esconda as mensagens para comparar a leitura; repare no tempo de parede contra a soma.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinamotionMediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Medir o quadro da cena e gravar seis segundos dela em vídeo
Suba as partículas, force um bloqueio de 300 ms e leia o medidor; depois grave seis segundos, veja o codec escolhido e baixe o arquivo.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinasem pacotesigma.js, graphology com ForceAtlas2 e cosmos.gl
Ver o grafo real do curso e um grafo de milhares de nós se organizarem em aglomerados
Rode o layout no grafo real, passe o mouse pelos nós e busque uma entidade; troque para 20 mil nós e leia o medidor; depois carregue o modo massivo na placa de vídeo.
Pacote
Abrir no capítuloAnimar um grafo de conhecimento amplo em movimentosigma, graphology, graphology-layout-forceatlas2, graphology-generators, @cosmos.gl/graph
Capítulos vizinhos em Frontends com Vibecoding
- 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