Frontends com Vibecoding · Capítulo 3 de 33 · 35 min
Escolher a stack e projetar suas dependências
Você escolhe a base do projeto pelo tipo de página, escreve o motivo, confere a árvore de dependências e calcula quanto custaria trocar de stack mais tarde.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding.
Trocar a base do site depois de vinte telas prontas custa reescrever quase tudo, por isso essa escolha vem antes do primeiro comando. Conteúdo que se lê pede Astro, aplicativo que se opera pede Next.js e arquivo que abre sozinho pede HTML puro.
A base é o framework, ou seja, a estrutura pronta que já resolve o trabalho repetido de todo site, como a planta e a fundação de uma casa. Você a escolhe pelo que a página faz, com o motivo por escrito.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Três coisas decidem a base: o que a página faz, quem vai cuidar dela e por quanto tempo. Um site escrito em HTML puro com JavaScript nativo já entrega filtro e clique. O framework compensa quando entram estado (o que a tela lembra, como o carrinho cheio), rotas (os endereços internos) e componentes (peças de tela reaproveitadas em vários lugares).
Responda então duas perguntas antes de decidir. A página precisa aparecer no Google e ser citada por assistente de IA, ou precisa abrir direto de um arquivo, sem servidor? E quanto JavaScript o celular do seu cliente aguenta sem travar? Quem mantém o site daqui a um ano fecha o critério.
Astro manda ao navegador uma página já montada em HTML e só liga JavaScript nos pedaços que você marcar, chamados de ilhas. Ligar uma ilha é hidratar, ou seja, dar movimento ao pedaço parado, como acender uma única televisão na vitrine em vez de todas.
Isso decide dinheiro porque cada trecho de JavaScript atrasa a abertura no celular, e página lenta perde a visita antes de ser lida. Por isso o Astro é a escolha para blog, documentação, site institucional, microsite e relatório estático, onde a pessoa lê e quase não opera nada.
O erro típico é marcar toda ilha para hidratar de imediato. O site volta a pesar como qualquer outro e você perde o motivo de ter escolhido o Astro. O catálogo de uma escola, que só lista curso, turma e matrícula, é o caso limpo: ali uma base de aplicativo cobraria servidor e manutenção que ninguém pediu.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Next.js existe para a outra metade do mundo: página com login, painel e dado que muda a cada minuto. Ele monta boa parte da tela no servidor e entrega pronta, então o navegador recebe menos trabalho e a pessoa vê o conteúdo antes.
A linha em uso aqui é a 16.3, que já vem com o Turbopack. Turbopack é o empacotador, o programa que junta os seus arquivos num pacote que o navegador entende, e esse junta rápido mesmo numa sessão longa de trabalho.
Por baixo roda o React, a biblioteca que desenha a tela em componentes. Uma falha de segurança registrada como CVE-2025-55182 atinge as versões 19.0.0 a 19.2.2 e pede correção nesta semana. CVE é o registro público de uma falha, com número, e o número é o que decide: acima da 19.2.2 você está fora dela.
As outras bases entram por um motivo prático: a equipe já as domina. Quem vem de um projeto React antigo segue no React Router. Quem já escreve em Svelte fica no SvelteKit, e quem tem time de Angular continua nele. Trocar de base para acompanhar novidade custa meses e não muda nada que o cliente veja.
Duas advertências de versão valem o espaço. Fique no HTMX 2.0.10, porque a linha 4.0 ainda em beta, ou seja, em teste aberto antes do lançamento, quebra o que já está no ar. A regra geral vem daí: versão marcada como beta ou como candidata a lançamento não entra em site de cliente, por melhor que pareça.
Tipo de página e base recomendada em setembro de 2026
| Tipo de página | Base recomendada | O que decide |
|---|---|---|
| Blog, documentação, site institucional, microsite | Astro 7 (7.3.2, 8 set. 2026) | HTML pronto; JavaScript só nas ilhas; Fonts API e CSP embutida |
| Relatório estático de acabamento alto | Astro 7 com MDX | Live Content Collections e publicação em Cloudflare Workers |
| Login, painel, carrinho, dado que muda a cada minuto | Next.js 16.3.4 sobre React 19.2.8 | Turbopack padrão; até 90% menos RAM em sessão longa; TypeScript 7 |
| Aplicação React vinda de Remix ou Create React App | React Router v7 | Caminho evolutivo; escolha pela migração de origem |
| Aplicação React com tipagem máxima | TanStack Start | Suporte beta ao Solid 2.0 desde abril de 2026 |
| Time que já domina Svelte | SvelteKit 2.x | Linha 3 em RC desde agosto de 2026; RC fica fora de produção |
| Formulário pesado em time Angular | Angular 22 | Signal Forms estáveis, interoperáveis com Reactive Forms |
| Componente de design system para vários frameworks | Lit | Web Components; sem major no trimestre |
| Página servida pelo servidor com pouco JavaScript | HTMX 2.0.10 e Alpine.js 3.15 | HTMX 4.0 em beta quebra atributos, cabeçalhos e eventos |
| Relatório único, auditável e offline | HTML e CSS com script clássico incorporado | Abre por arquivo quando código, dados e mídia são locais, sem importações remotas |
| Time em Vue, Nuxt, SolidStart, Qwik ou Preact | A versão que o time já domina | Sem major no trimestre; Nuxt ainda sem anúncio |
| Site público e painel com login no mesmo negócio | Astro no público e Next.js no painel | Mesmo arquivo de tokens dos dois lados |
Custo de saída é o preço de abandonar uma tecnologia já construída, e quase ninguém calcula esse preço antes de escolher. As três bases montam a página de jeitos que não se traduzem entre si, então a conta não é trocar uma peça, e sim refazer o encaixe inteiro.
No Astro você decide ilha por ilha o que paga JavaScript. No Next.js você decide qual pedaço roda no servidor. Trocar depois de vinte telas prontas refaz onde o dado é buscado, onde o estado mora e qual arquivo manda em cada endereço. Proposta de troca sem o número de telas reescritas é proposta incompleta.
Quando site público e painel com login convivem, compare manter um projeto só com separar dois. Astro no público e Next.js no painel funciona bem, mas dobra a operação que alguém precisa cuidar. Se dividir, compartilhe o mesmo arquivo de tokens, que são cor e tipografia guardadas com nome, e escreva quem mantém cada publicação.
Crie o projeto já com TypeScript ligado e um arquivo de tokens antes da primeira tela. A partir daí, trocar a cor da marca no site inteiro passa a exigir uma linha só desse arquivo. Publique a primeira página num endereço público e confirme que o React instalado está acima da versão 19.2.2 antes de aprovar qualquer tela seguinte.
Saiba o que instalar em cada parte, e o que vem junto
A base do projeto está escolhida, e cada camada acima dela ainda pede uma peça padrão, um degrau sem biblioteca e a árvore de dependências conferida.
Um pacote instalado sem conferência pode carregar nome inventado pela IA e abrir uma porta de ataque no seu site. Pacote, ou biblioteca, é um pedaço de programa pronto que alguém publicou e você passa a usar dentro do seu.
Cada camada da tela tem uma peça padrão, e o que ela arrasta junto se confere antes de instalar. Agente é o assistente de IA que escreve o código. Quem aprova o que ele sugere decide a peça de cada camada e também o plano B sem instalar nada.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Seis camadas já têm dona, e saber o nome delas encurta reunião. A aplicação com login é Next.js e o conteúdo é Astro, a única camada em que trocar significa reescrever. O estilo é Tailwind, que descreve a aparência em pequenas marcações dentro da própria tela, em vez de num arquivo separado.
O componente vem do shadcn, copiado para dentro do projeto em vez de instalado, o que deixa você livre para alterá-lo. Teste cada um de novo com o teclado e com leitor de tela, porque acessibilidade que veio de fábrica costuma se perder na primeira alteração.
Ícone é Lucide, e só ele: misturar famílias de ícone faz a interface parecer montada por pessoas diferentes. O gráfico é Recharts, e painel com milhões de pontos pede ECharts. A loja que ia instalar três pacotes só para avisar pedido confirmado resolveu com um, o Sonner.
Acima delas ficam as utilidades de tela, e cada uma tem um degrau abaixo que resolve sem instalar nada. O nuqs guarda aba, filtro e paginação no próprio endereço da página. O teste é copiar o link e abrir em outra aba: se a tela volta diferente, o estado mora no lugar errado.
Lista comum serve até algumas centenas de itens; acima disso entra o TanStack Virtual, que desenha só as linhas visíveis. O cmdk, o Sonner e o Vaul entregam busca por comando, aviso de canto e gaveta inferior, e são o padrão de fato nesse conjunto de peças.
O Floating UI posiciona menu, dica e balão, e essa camada encolheu porque o próprio navegador passou a fazer parte do trabalho. Mantenha a biblioteca enquanto o seu painel de visitas mostrar navegador antigo, e garanta uma posição que continue legível quando o recurso novo for ignorado.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Já o number-flow anima um número dígito a dígito na direção certa, como o contador da bomba de combustível. Ele serve ao indicador que a diretoria acompanha ao vivo, porque o olho percebe a mudança antes mesmo de ler o valor.
Para tour de produto, o driver.js é leve e resolve a apresentação simples da tela a quem chega. O Shepherd.js cobre caminhos com desvio, mas a licença dele obriga a abrir o seu código ou pagar, e isso se lê antes de instalar. O auto-animate anima uma lista que reordena com uma linha.
O dado que vem do servidor e o estado que só existe na tela moram em lugares diferentes. Confundir os dois origina boa parte das telas que mostram número errado. TanStack Query ou SWR guardam a cópia do servidor em cache, a cópia local que evita pedir o mesmo dado de novo.
Zustand ou Jotai cuidam do estado leve da tela com pouco código. Redux Toolkit entra quando cada mudança precisa ficar registrada para auditoria, e cobra mais escrita justamente por isso. Para histórico que precisa sobreviver ao fechar da aba, o navegador tem banco próprio: mostre o dado de ontem e atualize por trás.
Tempo real começa pelo modo mais simples, o SSE: o servidor empurra e o navegador só ouve, como um rádio ligado. Isso cobre aviso, contador e acompanhamento de pedido, que é quase tudo o que um negócio pequeno precisa mostrar ao vivo.
WebSocket é a conversa nos dois sentidos e só entra quando a tela também precisa falar o tempo todo. Ele cobra atenção porque não segura fila sozinho: sem controle, o cliente lento acumula mensagens até travar. WebAssembly é acelerador cirúrgico, usado num cálculo pesado específico e nunca como substituto do frontend inteiro.
Cada necessidade, a peça padrão e o plano B sem biblioteca
| Necessidade | Peça padrão | Critério e plano B |
|---|---|---|
| Aba, filtro e paginação | nuqs | Estado na URL para o link compartilhado abrir igual; sem ele, o estado some ao recarregar |
| Lista longa | TanStack Virtual | A partir de algumas centenas de itens; abaixo, lista comum |
| Menu flutuante, dica e balão | Floating UI | Enquanto o público usa navegador anterior ao anchor positioning (Newly Available em 13 jan. 2026); depois, só CSS |
| Paleta de comandos, aviso e gaveta | cmdk, Sonner e Vaul | Padrão de fato em stack shadcn; um aviso só dispensa os três |
| KPI que muda ao vivo | number-flow | Dígito a dígito na direção certa; sem ele, troque o número sem animar |
| Tour de produto | driver.js (cerca de 5 kB) | Shepherd.js só com lógica condicional, atento à licença AGPL ou comercial |
| Lista que reordena | auto-animate | Uma linha; o degrau abaixo é a transição de vista do navegador |
| Dado do servidor em cache | TanStack Query ou SWR | Revalidação automática; sem eles, cada tela pede o mesmo dado de novo |
| Estado leve da tela | Zustand ou Jotai | Pouco código; Redux Toolkit quando cada mudança precisa de auditoria |
| Fluxos de eventos combinados | RxJS | Só com streams sofisticados; fora disso pesa sem retorno |
| Histórico que sobrevive à aba fechada | IndexedDB com stale-while-revalidate | Mostra o de ontem e atualiza por trás |
| Aviso do servidor em tempo real | SSE | WebSocket só em conversa intensa nos dois sentidos, com fila controlada |
| Cálculo pesado na tela | WebAssembly cirúrgico | Layout de grafo, decimação de série e hit testing; o frontend inteiro fica fora |
Toda biblioteca instalada traz outras dentro dela. A árvore final, que é a lista completa do que entrou junto, fica sempre maior que a lista que você escolheu. Rode npm ls --all e veja o tamanho real antes de confiar no que foi prometido.
Duas contas saem daí. A de licença: uma peça liberada pode arrastar outra restritiva e prender o seu código a condições que ninguém leu. A de segurança: cada peça é uma porta. Um modelo de IA inventa nome de pacote com confiança total, e existe ataque que registra esses nomes esperando quem instale sem olhar.
Antes de aceitar qualquer pacote sugerido, rode npm ls --all para ver a árvore inteira e npm audit para a lista de falhas conhecidas. Abra a página de cada um no registro npm e confirme duas coisas: lançamento recente e licença que permita uso comercial.
Pergunte antes de tudo isso, porém, se o navegador já resolve sozinho. Recursos que chegaram ao navegador nos últimos meses tiram bibliotecas inteiras da sua lista sem instalar nada, e essa é a economia mais barata que existe.
Guia prático: o que 51 sites profissionais usam de stack, e o que isso ensina
A pergunta "qual stack usar" tem resposta medida quando você olha o que gente que vende template escolheu. Nos 51 templates estudados em 07/10/2026, contando o package.json de cada um:
| Item | Templates | Leitura |
|---|---|---|
| Vite | 51 | Nenhum Next.js, nenhum Astro |
| React | 48 | 36 na versão 18 e 12 na 19; 3 sem React |
| TypeScript | 12 | Os outros 39 são JavaScript |
| Tailwind v4 | 12 | Pelo plugin do Vite |
| Tailwind v3 | 33 | Pelo PostCSS; 5 sem Tailwind no pacote |
| GSAP / Lenis | 11 / 9 | Movimento ligado à rolagem |
| iconify-icon / lucide-react | 34 / 18 | Ícone buscado na rede contra pacote local |
| ESLint | 20 | Nenhum template com teste |
Para página de marketing que é uma tela só, Vite com React resolve, e ninguém ali precisou de servidor. A conta muda quando a página tem várias rotas. Dos 51, 30 usam BrowserRouter, que cria endereços como /cardapio. Num host estático, quem abre esse endereço direto ou recarrega a página recebe erro 404, porque o servidor procura um arquivo que não existe. Nenhum dos 51 usa HashRouter, e o CLAUDE.md de todos promete subir em qualquer host sem configuração extra.
A segunda lição está no que vem junto. Os templates em TypeScript carregam um pacote de componentes pronto, e a página usa 12 dos 53. Escolha a stack pelo que a página faz e conte o que você vai manter, não só o que vai usar hoje.
Antes de publicar este projeto Vite, confira as rotas.
1. Liste as rotas do app e diga se ele usa BrowserRouter ou HashRouter.
2. Se for BrowserRouter, crie a regra de fallback para o host [Netlify | Vercel | Cloudflare Pages],
mandando todo endereço desconhecido para index.html com status 200.
No Netlify, a regra no arquivo public/_redirects é: /* /index.html 200
3. Rode o build e abra direto, numa aba nova, a rota [/rota-interna] na pré-visualização.
4. Liste dependências que nenhum arquivo importa e remova só depois do meu ok.
5. Diga o tamanho do JavaScript comprimido antes e depois.Escolher e limpar a stack de uma página de marketing
Cinco passos. Valem para template baixado e para projeto que o agente criou do zero.
Passo 1: Descreva o que a página faz antes de escolher
Uma tela só, várias páginas de conteúdo, área logada ou loja. Página única de campanha cabe em Vite; conteúdo que precisa aparecer na busca e várias rotas pedem renderização no servidor ou geração estática.
Deu certo quando: A escolha de stack vem acompanhada de uma frase sobre o que a página faz.
Erro comum: Escolher pela stack que o template trouxe e não pelo que o negócio precisa.
Passo 2: Confira o roteador e o host
Se o projeto tem rotas com BrowserRouter, crie a regra de fallback do host antes do primeiro deploy, com o pedido do bloco acima.
Deu certo quando: Abrir direto e recarregar qualquer rota mostra a página, não um 404.
Erro comum: Testar só navegando pelo menu, que funciona, e descobrir o erro quando o link chega pelo WhatsApp.
Passo 3: Corte o que vem junto e não é usado
Peça a lista de dependências sem importação e de componentes de exemplo. Um driver de banco num site sem servidor, uma biblioteca de gráficos numa página sem gráfico: tudo isso sai.
Deu certo quando: Cada pacote do package.json tem um arquivo que o importa.
Erro comum: Apagar componente que é importado de forma indireta; rode o build depois de cada remoção.
Passo 4: Prefira o pacote local ao que busca na rede
Ícone que vem de uma API externa em tempo de execução depende de outro servidor a cada visita. Pacote local, importado só no ícone que você usa, entra no build e não falha.
Deu certo quando: A página carrega ícones e fontes sem chamada a servidor de terceiros.
Erro comum: Trocar a biblioteca de ícones no meio do projeto e misturar duas famílias de traço.
Passo 5: Acrescente o teste que nenhum template trouxe
Um teste do Playwright que abre a página, confere o título principal e abre uma rota interna direto já pega os dois erros mais comuns desta lista.
Deu certo quando: O teste roda antes de cada publicação e passa.
Erro comum: Confiar no lint como se fosse teste; ele não abre a página.
No fim você tem: Uma stack escolhida pelo que a página faz, sem dependência morta e com as rotas funcionando no host estático.
Guia prático: o que a stack de agosto a outubro de 2026 mudou para quem constrói com agente
A aula escolhe entre Astro e Next.js pelo que a página faz. De agosto a outubro, as duas bases ganharam funções que mudam o custo de manter: o Next.js passou a escrever no AGENTS.md (o arquivo de regras que o agente lê) o caminho da documentação da versão instalada, recomendou Cache Components para todo app e passou a reprovar o build quando um conteúdo dinâmico entra por acidente numa rota estática; o Astro agora reconstrói só as páginas que mudaram. Você sai daqui sabendo qual chave ligar em cada base e como provar que ela funcionou.
Funções, casos de uso e aplicações
Funções
As funções novas de Next.js e Astro que pesam na escolha
| Função ou recurso | O que faz | Quando usar | Desde |
|---|---|---|---|
| AGENTS.md versionado (Next.js 16.3) | O next dev escreve e mantém um bloco no AGENTS.md que manda o agente ler a documentação da versão instalada, dentro de node_modules | Todo projeto Next com agente; o bloco volta sozinho se for apagado | 03/08/2026 |
| Ajudante instant() do @next/playwright | Teste que afirma o que aparece na hora depois do clique, antes da rede responder; reprova se uma mudança deixar a navegação lenta | Catálogo, área logada e painel com navegação frequente | 03/08/2026 |
| Cache Components recomendado para todo app (Next.js 16.4) | Liga cacheComponents e partialPrefetching: o app marca com 'use cache' o que pode ser guardado; vem ligado em projeto novo do create-next-app | Projeto novo; projeto existente migra com as skills de adoção | 06/10/2026 |
| ensureStatic (Next.js 16.4) | Derruba o build se um componente dinâmico entrar numa rota que deveria ser estática ('navigation', 'prefetch' ou 'shell') | Landing, blog e loja, onde renderizar por visita custa servidor | 06/10/2026 |
| next upgrade --agent e experimental.agentUpgrade | Prepara guia de migração, codemods e verificação para o agente aplicar; avisa no dev e no build quando há atualização de segurança | Manter o projeto em dia sem lembrar de conferir; a política padrão é 'security' | 06/10/2026 |
| Build estático incremental (Astro 7.2, experimental) | Pula páginas pré-renderizadas cujo código e conteúdo não mudaram, pela cacheKey devolvida em getStaticPaths() | Blog e documentação com centenas de páginas | 06/08/2026 |
| astro preview --background e --ignore-lock | A prévia roda em segundo plano, com status, logs e stop; a 7.3 permite várias prévias ao mesmo tempo | Agente que sobe a prévia, testa e derruba sem prender o terminal | 06/08/2026 e 03/09/2026 |
Funções marcadas como experimentais mudam de nome ou de comportamento entre versões: registre a versão no README do projeto.
Casos de uso
Coordenador de conteúdo de uma faculdade particular em Salvador, com 400 páginas de curso em Astro
Educação
Dor
Cada correção de vírgula numa página de curso disparava o build das 400 páginas, e a publicação do vestibular demorava a sair.
Solução
Ligou o build incremental do Astro 7.2 numa cópia do projeto, devolvendo entry.digest como cacheKey nas páginas da coleção de cursos, e comparou o tempo do build com e sem a chave.
Resultado
O que observar: o tempo do segundo build depois de editar uma página só, e se a página editada sai atualizada. Como a função é experimental, mantenha a cópia por duas semanas antes de levar ao projeto principal.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Desenvolvedora de uma loja de cosméticos de São Paulo em Next.js
Marketing digital e comércio
Dor
Um selo de "olá, cliente" entrou no cabeçalho compartilhado e transformou as páginas de produto, antes estáticas, em páginas renderizadas a cada visita, com a conta do servidor subindo.
Solução
Pôs export const ensureStatic = 'navigation' no layout das páginas de produto e moveu o selo para uma ilha do cliente. O build passou a reprovar qualquer componente dinâmico naquela parte.
Resultado
O que observar: no painel do host, as invocações de função das páginas de produto na semana seguinte; e se o build reprova quando alguém tenta repetir o erro.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Na prática
Este portal roda Next.js 16.3 e o AGENTS.md da raiz já traz o bloco que o next dev escreve, entre <!-- BEGIN:nextjs-agent-rules --> e <!-- END:nextjs-agent-rules -->, mandando ler node_modules/next/dist/docs/ antes de escrever código. A segunda decisão de stack está em next.config.ts: o cache de disco do build, que o Next.js 16.3 liga por padrão, foi desligado só na Vercel depois de uma medição. Em 120 builds, o cache passou de 1,5 GB, acima do limite do host, e um build sim, outro não, começava do zero.
/** Cache persistente do Turbopack no `next build` (ver experimental abaixo). */
function turbopackCacheDeBuild(): boolean {
const forcado = process.env.NEXT_TURBOPACK_BUILD_CACHE;
if (forcado === "1") return true;
if (forcado === "0") return false;
return !process.env.VERCEL;
}
const nextConfig: NextConfig = {
experimental: {
// Cache persistente do Turbopack no build: DESLIGADO na Vercel.
// Diagnóstico de 27/09/2026 (120 builds de 25 a 27/09): o cache passou de
// 1,5 GB, acima do teto de cache de build da Vercel.
turbopackFileSystemCacheForBuild: turbopackCacheDeBuild(),
},
};Adotar uma função nova da stack sem surpresa no host
Passo 1: Leia a nota de versão na fonte e anote a data
Separe o que é estável do que é experimental. No Next.js 16.4, Cache Components é recomendado; lazy dynamic imports seguem experimentais.
Deu certo quando: Cada chave tem versão, data e estado anotados no README.
Erro comum: Ligar a chave vista num vídeo sem saber de que versão ela é.
Passo 2: Ligue numa branch e meça antes e depois
Tempo de build, tamanho do cache, peso do JavaScript por rota e invocações de função no host.
Deu certo quando: Você tem dois números para comparar.
Erro comum: Medir só na sua máquina e descobrir o limite do host no deploy.
Passo 3: Prenda o comportamento num teste ou numa regra de build
ensureStatic para a rota que deve ser estática, instant() para a navegação que deve ser imediata.
Deu certo quando: Uma mudança futura que quebre a decisão reprova sozinha.
Erro comum: Confiar que ninguém vai pôr um componente dinâmico no cabeçalho.
Passo 4: Escreva o motivo ao lado da configuração
Como no next.config.ts do portal: o que mediu, quando e o que fazer para testar o outro lado.
Deu certo quando: Quem chega depois entende por que o padrão foi desligado.
Erro comum: Um false solto que o próximo agente troca por true.
No fim você tem: Funções novas adotadas com número medido, regra automática e o motivo escrito no próprio arquivo.
Armadilhas
Padrão do framework não é padrão do seu host
Toda chave que muda build ou cache se mede no host de produção antes de virar regra do projeto.
- Cache de build ligado por padrão pode passar do limite do host
- Não apague o bloco do AGENTS.md: o next dev recria e o agente perde a referência
- Função experimental entra com data de revisão anotada
- ensureStatic reprova o build: avise a equipe antes de ligar
- Astro incremental só pula páginas que devolvem cacheKey
O teste: Dois builds seguidos no host: o segundo reaproveitou o cache?
alexandrecaramaschi.com/educacao/frontends-com-vibecoding
Aplicar os recursos ao projeto
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Astro monta páginas de conteúdo em HTML pronto e só liga comportamento onde você pede. Essas áreas ligadas se chamam ilhas, porque carregam código numa região cercada, como um quiosque dentro da loja. Serve para catálogo e documentação, em que quase tudo é leitura, com poucos cliques.
Ponha o texto do manual em src/pages/manual.astro e importe um componente de calculadora de frete. Renderize a calculadora com client:visible, a instrução que só carrega o código quando ela chega à tela. O resto da página continua HTML puro. Rode astro build e publique a pasta de saída inteira.
Peça o HTML entregue ao navegador e confirme que o texto já está lá antes de qualquer script rodar. Role até a calculadora e observe a aba de rede baixando o código dela. Marcar tudo com client:load joga esse trabalho para o primeiro segundo e atrasa a abertura no celular do cliente.
Eleventy junta seus textos e um modelo e cospe arquivos prontos antes da publicação. Quem visita recebe só o resultado, sem rodar nada. Ele serve quando você quer páginas editoriais e controle do HTML final, deixando a interação como uma decisão separada da geração das páginas.
Escreva index.md com o título e a lista de serviços da sua empresa. Acrescente um modelo Nunjucks com cabeçalho e rodapé e aponte esse modelo no campo layout do texto. Rode o comando eleventy; a saída cai em _site. Copie a pasta de fotos com addPassthroughCopy na configuração do projeto.
Abra _site e confira títulos, links relativos e arquivos copiados. Mudou o Markdown? Gere o site de novo, porque a pasta não se atualiza sozinha. Página estática ainda pode puxar fonte ou script de fora; teste a pasta sem internet e corte o que impedir a leitura.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
React amarra componentes, dados e tela num fio só. Um componente recebe propriedades de fora e pode guardar estado, o valor que muda durante o uso. Vale quando filtro, seleção e resultado precisam andar juntos. Numa página só de leitura, esse maquinário cobra peso de carregamento sem devolver nada em troca.
Sua marcenaria tem um simulador de orçamento. Declare quantidade com useState(1), a função que guarda um valor e avisa a tela quando ele muda. O botão chama setQuantidade(valor => valor + 1). Calcule o total ao desenhar e passe o resultado ao resumo; use o identificador de cada peça como key.
Clique várias vezes seguidas e depois apague uma peça do meio da lista. A seleção tem de seguir o identificador certo, não a posição. Guardar o total também como estado abre porta para dois números diferentes na mesma tela; calcule o que der em vez de guardar.
Next.js põe regras de páginas, carregamento e execução em cima do React. A decisão central é onde cada informação nasce: na hora de gerar o site, num servidor a cada visita, ou no navegador. Site com login e dado privado exige um projeto de acesso diferente de um catálogo público.
Para o catálogo de serviços da sua clínica, crie app/servicos/page.tsx e ponha output: 'export' em next.config.js. Rode next build e publique a pasta out numa hospedagem comum. Rotas com endereço variável pedem generateStaticParams com os valores conhecidos. Só o filtro que reage à digitação vira um componente cliente.
Visite cada endereço direto na hospedagem, sem passar pela home, e leia o HTML gerado. Recurso que depende de servidor vivo não aparece por mágica na exportação. O otimizador de imagens também pede configuração própria. Exportar as páginas não certifica abertura por duplo clique.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Vue liga o desenho da tela a valores reativos, que avisam sozinhos quando mudam. Um componente de arquivo único guarda marcação, comportamento e estilo no mesmo lugar, como uma pasta por peça. Serve a quem prefere declarar a tela perto do HTML que já conhece.
Dentro de um componente com script setup, importe ref e computed de vue. Declare quantidade = ref(1) e total = computed(() => quantidade.value * 50), o cálculo que se refaz sozinho. No modelo, ligue um campo numérico com v-model.number à quantidade e mostre total num output. O 50 é preço fictício e sai dos seus dados.
Digite uma quantidade, apague o campo e tente um número negativo. Converter para número não é validar regra de negócio. Confira se a mesma regra existe no serviço que recebe o pedido. Componente Vue precisa ser preparado antes de virar entrega; o arquivo de autoria não é o que o cliente recebe.
Biblioteca de interface e estrutura de aplicação
| Base | Estrutura relacionada | Decisão adicional |
|---|---|---|
| React | Next.js | Rotas e modo de entrega |
| Vue | Nuxt | Rotas e modo de entrega |
| Svelte | SvelteKit | Rotas e modo de entrega |
| Angular | Convenções integradas | Adoção pela equipe |
Os pares mostram relações de ecossistema, sem afirmar que uma aplicação precisa obrigatoriamente usar o framework relacionado.
Nuxt organiza páginas e formas de publicar uma aplicação Vue. Cada rota pode ser preparada antes, no seu computador, ou calculada no servidor a cada visita. Gerar tudo antes cabe a conteúdo conhecido; informação particular de cada cliente pede login e serviços que continuem de pé depois.
Siga a estrutura de páginas da versão instalada e crie a rota de serviços da sua empresa, carregando o catálogo público na geração. Rode nuxt generate para montar a saída em .output/public. Cadastre à mão as rotas que o processo não alcança por link. Publique a pasta inteira, com arquivos de navegação e dados.
Entre direto numa rota interna e recarregue a página. Se ela depender de uma API privada, a geração não leva junto as permissões nem as operações dela. Leia também o HTML inicial e as chamadas de dados. Destino estático continua sendo endereço na web; duplo clique é outra entrega.
Svelte compila os componentes antes de o site subir e dá uma escrita curta para estado e tela. As runas são marcações que o compilador reconhece para saber o que muda. Serve a componentes com comportamento local, desde que a equipe mantenha a sintaxe da versão instalada.
Escreva um arquivo .svelte com runas e declare let quantidade = $state(1) no bloco script. Acrescente um botão com onclick={() => quantidade++} e mostre {quantidade} no texto. Para um preço derivado, use $derived(quantidade * 50). Gere o componente pelo ambiente de construção do projeto, não pelo navegador.
Clique, olhe o número e teste o componente depois da compilação de produção. Uma variável comum não ganha o tratamento de $state nessa sintaxe, e o botão fica mudo. Evite misturar exemplos de versões diferentes sem adaptar. O navegador recebe JavaScript compilado, nunca o arquivo .svelte original.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
SvelteKit acrescenta rotas, carga de dados e opções de publicação ao Svelte. O adaptador decide o formato da entrega, como escolher entre correio e retirada na loja. Quando toda página pode ser calculada antes da visita, adapter-static gera arquivos; operação de servidor pede outra arquitetura de publicação.
Instale @sveltejs/adapter-static e chame adapter() em kit.adapter no svelte.config.js. Para um portal todo gerado antes, exporte prerender = true no layout certo. Monte as páginas conhecidas e rode a construção. Rota com endereço variável precisa das entradas declaradas para que cada página vire um arquivo.
Acesse uma rota interna sem passar pela página inicial. Um fallback para a aplicação cliente depende de regra da hospedagem e não substitui a pré-renderização. Confirme que nenhum formulário chama ação de servidor que sumiu da saída estática. Se você pretende abrir os arquivos localmente, teste caminhos relativos e módulos gerados antes.
Angular entrega convenções prontas para componentes, injeção de dependências e formulários. Injeção de dependências é entregar ao componente os serviços que ele precisa, como um almoxarifado que separa o material. Compensa quando uma equipe mantém muitas telas parecidas e prefere um jeito comum a escolher biblioteca por biblioteca.
No componente, importe signal e computed de @angular/core. Declare quantidade = signal(1) e total = computed(() => quantidade() * 50), o valor que se recalcula. O botão roda quantidade.update(valor => valor + 1) e o modelo mostra total(). Mantenha a busca do preço num serviço e injete esse serviço.
Acione o controle e veja se a tela muda sozinha, sem você mexer no elemento. Teste também o que aparece enquanto o serviço carrega e quando ele falha. Convenção de Angular não faz autorização de dados no navegador. A entrega final passa por construção, rotas e hospedagem bem combinadas.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Solid observa quais pedaços da tela dependem de cada valor e refaz só esses pedaços. Um sinal guarda um valor e avisa quem o lê. A escrita usa JSX, a mistura de marcação com expressões, mas o funcionamento difere de React; copiar hábitos de lá pode travar a atualização da tela.
Importe createSignal de solid-js e declare const [quantidade, setQuantidade] = createSignal(1). No botão, chame setQuantidade(valor => valor + 1). Mostre quantidade() no JSX e calcule o preço numa expressão que também leia quantidade(). Chamar a função com parênteses é o que registra a leitura do sinal ali.
Compare o número antes e depois de cada clique. Se você copiar quantidade() para uma constante fora do trecho reativo, aquela cópia congela e a tela para. Meça componentes reais no pacote de produção; comparação genérica de velocidade não prevê o seu catálogo. Rotas e serviços seguem decisões separadas.
Qwik retoma a interação a partir do HTML e de dados salvos, em vez de acordar todos os componentes de uma vez. Serializar é transformar o estado em dados que viajam junto com a página. Isso cobra disciplina sobre o que cada função captura e quando o código chega.
Monte um componente com component$ e declare quantidade = useSignal(1). No botão, use onClick$={() => quantidade.value++} e mostre quantidade.value. O cifrão marca uma fronteira que a preparação pode cortar em pedaços. Publique pelo adaptador certo e observe a aba de rede baixar o código no primeiro clique.
Teste o primeiro clique com internet lenta e com falha de carregamento. Não guarde conexões ou objetos que não viram dados sem seguir as regras do framework. Evento adiado pede cuidado extra, como preventdefault:click para segurar uma navegação. Funcionar sem rede exige preparar todos os arquivos antes disso.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Alpine.js põe estado e eventos ao lado da marcação, sem transformar a página inteira numa árvore de componentes. Cabe em interação pequena sobre conteúdo já pronto, como revelar um filtro ou abrir uma descrição. A vantagem some quando muitas áreas precisam combinar regras e sincronizar dados entre si.
No contêiner, declare x-data='{ aberto: false }'. No botão, use @click='aberto = !aberto' e :aria-expanded='aberto', que avisa ao leitor de tela se a área abriu. Aplique x-show='aberto' na região e carregue uma cópia da biblioteca com defer. Mantenha o texto legível mesmo se ela falhar.
Teste com o teclado e confirme que aria-expanded muda junto com a visibilidade. Conteúdo escondido só por CSS antes da inicialização some de vez se o script falhar. Política de segurança que bloqueia avaliação dinâmica exige a distribuição compatível de Alpine; confira isso antes de publicar.
htmx deixa um controle de HTML pedir um pedaço de página ao servidor e trocar só aquele trecho. O servidor continua dono do conteúdo e das regras de acesso. Cabe bem em sistemas de formulário e de documento, quando a equipe já monta as páginas direto no servidor.
No botão que atualiza o estoque, declare hx-get='/estoque/resumo', hx-target='#resumo' e hx-swap='innerHTML'. Esse endereço devolve só o pedaço de HTML do resumo, e não a página toda. Mostre um aviso de carregando e mantenha um link comum para quem estiver sem script, como o cliente no celular antigo.
Olhe a resposta que volta e depois desligue a rede de propósito. A tela precisa guardar o último estado válido e dizer que falhou. Nunca injete conteúdo de terceiro sem tratamento no servidor. Esse exemplo depende de HTTP e de um serviço vivo; arquivo solto no computador não faz isso.
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
- Introdução ao Next.jssugerido pelo grafoApresenta o conceito “Next.js”, usado em “Escolher a stack e projetar suas dependências”.
- Montar vídeo em React com Remotion e renderizar na sua máquina ou na AWSsugerido pelo grafoApresenta o conceito “React”, usado em “Escolher a stack e projetar suas dependências”.
- As linhas que ninguém orça: build, medição e logsugerido pelo grafoApresenta o conceito “Build”, usado em “Escolher a stack e projetar suas dependências”.
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
- 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
- Node.js: JavaScript no ServidorIntrodução ao Next.jsExaminar conexões de Introdução ao Next.js
- 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
- Vibecoding para SEOO Manifesto Vibecoding: Programe sem ProgramarExaminar conexões de O Manifesto Vibecoding: Programe sem Programar
Voltar ao capítulo anterior: Dirigir o prompt e avaliar a entrega do agente
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
- 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