Capítulo 18: Framework Next.js App Router (SSR, SSG e Hydration)
Especialização Frontend com React & TypeScript • React 19, Hooks, Estado Global e Next.js
🗺️ Mapa Conceitual do Tópico
flowchart TD
REQ["Requisição do Navegador"] --> RSC["React Server Component (Executa no Node.js)"]
RSC --> DB["Consulta direta ao Banco de Dados (Zero API Layer)"]
RSC --> HTML["Gera HTML Stream + Payload RSC"]
HTML --> BROWSER["Navegador exibe HTML instantâneo com zero JS inicial"]
🏛️ 1. A Nova Era com React Server Components (RSC)
O Next.js App Router adota a arquitetura de React Server Components (RSC) por padrão. Diferente das SPAs tradicionais onde todo o JavaScript é enviado para o cliente:
- Server Components: Executam exclusivamente no servidor. Eles têm acesso direto a bancos de dados, variáveis de ambiente seguras e arquivos do disco. O código desses componentes nunca é enviado no bundle JavaScript do cliente, resultando em páginas extremamente leves.
- Client Components: Marcados explicitamente com a diretiva
'use client'no topo do arquivo. São utilizados apenas quando a tela exige interatividade (event listenersonClick, hooks comouseStateou APIs do navegador).
⚡ 2. Estratégias de Renderização: SSR, SSG e Streaming
- Static Site Generation (SSG): Páginas pré-renderizadas em tempo de build. Velocidade máxima via CDN global.
- Server-Side Rendering (SSR): Páginas renderizadas no servidor a cada requisição para dados dinâmicos em tempo real.
- Streaming com Suspense: Permite enviar partes do HTML assim que estiverem prontas, enquanto componentes assíncronos mais lentos carregam em background sem travar a página.
📊 3. Comparativo: Server Components vs Client Components
| Característica | Server Components (Padrão) | Client Components ('use client') |
|---|---|---|
| Acesso a Banco de Dados / Secrets | ✅ Direto e seguro | ❌ Proibido (vaza credenciais) |
| Inclusão no Bundle JavaScript | Zero Bytes | Sim, empacotado para o navegador |
Uso de Hooks (useState, useEffect) |
❌ Não suportado | ✅ Suporte completo |
Interatividade (onClick, onChange) |
❌ Não suportado | ✅ Suporte completo |
⚠️ 4. Armadilhas Comuns e Anti-Padrões de Produção
- Adicionar
'use client'em Todo Lugar: Marcar componentes no topo da árvore como Client Components anula todos os benefícios de bundle zero dos RSCs. Mantenha'use client'nas folhas mais baixas da árvore que realmente precisam de eventos. - Erros de Hidratação (Hydration Mismatches): Renderizar conteúdos que diferem entre o servidor e o cliente (ex: formatar datas com fuso horário local ou invocar
Math.random()) gera avisos graves de hidratação no console.
💡 5. Diretrizes de Engenharia (Meta & React Docs)
- Passe Dados do Servidor para o Cliente via Props Serializáveis: Server Components podem renderizar Client Components passando dados serializáveis (JSON puro) como props.
- Aproveite o Fetch Nativo Estendido: O Next.js estende o
fetch()global com opções de cache automático (fetch(url, { next: { revalidate: 3600 } })).
💻 6. Demonstração Arquitetural do Conceito
// app/users/page.tsx - Server Component no Next.js App Router
import React from "react";
async function fetchUsersFromDb() {
// Simulação de query direta de banco de dados
return [
{ id: "1", name: "Alice Silva", role: "Arquiteta" },
{ id: "2", name: "Bruno Santos", role: "Engenheiro" }
];
}
export default async function UsersPage() {
const users = await fetchUsersFromDb();
return (
<div className="users-page">
<h1>Equipe de Engenharia (RSC - Zero JS)</h1>
<ul>
{users.map(u => (
<li key={u.id}>{u.name} - {u.role}</li>
))}
</ul>
</div>
);
}
📋 7. Cheat-Sheet da Fronteira Server / Client
- 🖥️ Server Component: Funções assíncronas
async function Page(), fetch direto, zero bundle JS. - 💻 Client Component: Diretiva
'use client', hooks interativos, event listeners.
🔍 8. Diagnóstico de Performance & React DevTools Profiler
Métricas Core Web Vitals no Next.js:
- LCP (Largest Contentful Paint): Com RSC e streaming SSR, o conteúdo principal deve ser renderizado em menos de 1.2 segundos em conexões 4G.
- Bundle Analysis: Execute
@next/bundle-analyzerpara auditar quais pacotes estão sendo enviados ao cliente versus mantidos exclusivamente no servidor.
🧪 9. Casos de Teste e Cenários de Borda Recomendados
- 🔍 Erro no Servidor durante SSR: Valide a captura graciosa de falhas de banco através do arquivo de rota
error.tsx. - 🔍 Streaming com Conexão Lenta: Verifique a renderização de esqueletos visuais no
<Suspense>durante o carregamento de dados. - 🔍 SEO e Metadados: Inspecione o HTML cru recebido pelo
curlpara certificar-se de que as tags<title>e<meta>estão presentes.