Cheatsheet

Cheatsheet — Next.js 16

Server vs Client Component

SituaçãoUsePorquê
Busca dado, usa secret/DB, sem estado/eventoServer Component (padrão)Não entra no bundle do cliente
Precisa de useState/useEffect/evento/API de browserClient Component ("use client")Só roda no browser
Página majoritariamente estática + 1 pedaço interativoServer pai + Client filho isoladoMarca só a fronteira mínima com "use client"
Server Component dentro de Client ComponentPasse como children/prop JSX, nunca import diretoMantém o Server Component fora do module graph do cliente

Cache: fetch vs use cache vs revalidate

Precisa deUseNota
Cachear resultado de fetch()cache: 'force-cache' (default sob Cache Components é sem cache)Web fetch estendida com next.revalidate/next.tags
Cachear função/componente async não-fetch (ORM, DB)"use cache" + cacheLife()/cacheTag()Nível de dado ou de UI
Cache por-usuário (cookies/headers)"use cache: private"Cacheado só no browser do usuário
Cache compartilhado entre instâncias self-hosted"use cache: remote" + cacheHandler customPrecisa storage externo (Redis etc.)
Revalidar por tempo (ISR clássico)revalidate no fetch/route segment ou cacheLife profilestale-while-revalidate
Revalidar sob demanda (webhook de CMS)revalidateTag()/revalidatePath()Serve stale enquanto revalida em background
Refletir mutação na hora (read-your-own-writes)updateTag() (só em Server Actions)Expira na hora, próximo read paga o recompute
Cache legado não determinísticounstable_cachePré-Cache Components; prefira use cache em projetos novos

generateStaticParams vs dynamic rendering

SituaçãoUse
Set finito e conhecido de params (produtos, posts)generateStaticParams prerenderiza no build
Params ilimitados, mas alguns conhecidosgenerateStaticParams parcial + dynamicParams: true (default) gera o resto sob demanda
Só páginas listadas podem existirdynamicParams: false → 404 pros não listados
Dado muda a cada requestSem generateStaticParams; deixe dinâmico

Route Handler vs Server Action

Precisa deUsePorquê
Endpoint consumido por client externo/webhook/mobile appRoute Handler (route.js)Web Request/Response padrão, URL pública
Mutação disparada de dentro de um form/componente ReactServer Action ("use server")Chamada RPC direta, sem definir endpoint
GET cacheável, servido como API públicaRoute Handler + "use cache"Route Handlers suportam cache desde v15+
Upload de form com progressive enhancementServer Action + <Form>/useActionStateFunciona sem JS, integra com pending state

App Router vs Pages Router

SituaçãoUse
Projeto novoApp Router (app/) — padrão desde v13
App legado grande, migração progressivaCoexistência app/+pages/ (App tem precedência), migrar rota por rota
getInitialProps/_app/_document/_errorSó existe no Pages Router
Server Components, streaming, PPR, Cache ComponentsSó existe no App Router

Convenções de arquivo (App Router)

ArquivoFunção
page.jsUI de uma rota; sempre a folha (leaf) da subárvore
layout.jsUI compartilhada entre um segmento e seus filhos, preserva estado na navegação
template.jsComo layout.js, mas remonta (key nova) a cada navegação
loading.jsEnvolve page.js num <Suspense> automático
error.jsError boundary de Client Component para o segmento
global-error.jsError boundary do root layout; precisa <html>/<body> próprios
not-found.jsUI de 404, disparada por notFound()
route.jsRoute Handler (endpoint HTTP), não pode coexistir com page.js no mesmo segmento
default.jsFallback de slot de Parallel Route em hard navigation
middleware.ts/proxy.tsRoda antes da request completar (renomeado pra proxy.ts na v16)

Deploy / self-hosting

SituaçãoUse
Deploy simples com Node.js persistentenext build && next start
Docker / container mínimooutput: 'standalone' — gera server.js + só os arquivos tracados
Host estático sem servidor Node (sem SSR/ISR/Route Handlers dinâmicos)output: 'export' — HTML/CSS/JS puro em out/
Múltiplas instâncias atrás de load balancercacheHandler compartilhado + deploymentId/generateBuildId consistente (evita version skew)
Plataforma não-Vercel com CDN própriaVerified Adapter (adapterPath) se existir; senão Node.js server genérico

Rendering: quando cada modelo

ObjetivoModelo
Página idêntica pra todos, pode ficar em CDNStatic (prerender no build ou primeira request)
Página muda por request (auth, dado real-time)Dynamic — usa cookies()/headers()/connection() ou não tem "use cache"
Mistura de estático (header/shell) + dinâmico (widget de usuário)Cache Components: componente dinâmico dentro de <Suspense>, resto no static shell (PPR)