Capítulo 19: Server Actions, API Routes, Caching Estratégico e SEO
Especialização Frontend com React & TypeScript • React 19, Hooks, Estado Global e Next.js
🗺️ Mapa Conceitual do Tópico
flowchart TD
CLIENT["Navegador: Chama Server Action"] --> POST["POST RPC Seguro em Background"]
POST --> BACKEND["Executa mutação no Servidor"]
BACKEND --> REVALIDATE["revalidateTag('produtos')"]
REVALIDATE --> PURGE["Purga cache da CDN e atualiza interface atômica"]
🏛️ 1. Server Actions: Mutações Seguras de Ponta a Ponta
As Server Actions no Next.js permitem que componentes invoquem funções assíncronas que executam exclusivamente no servidor, eliminando a necessidade de criar e manter endpoints manuais de API REST para simples operações de CRUD.
Ao anotar uma função com a diretiva 'use server', o framework cria automaticamente um endpoint POST seguro com proteção contra ataques de CSRF.
🔄 2. As Camadas Estratégicas de Cache no Next.js
O Next.js implementa uma arquitetura de cache de 4 camadas:
- Request Memoization: Deduplica requisições
fetchcom a mesma URL durante a mesma renderização. - Data Cache: Persiste dados buscados entre requisições de múltiplos usuários no servidor.
- Full Route Cache: Armazena o HTML e o payload RSC de rotas estáticas na build.
- Router Cache: Cache no navegador do cliente para navegação instantânea.
🏷️ 3. Invalidação Granular com revalidateTag e revalidatePath
Ao alterar dados no banco de dados através de uma Server Action, o cache do Next.js deve ser invalidado para que a interface reflita o novo estado:
"use server";
import { revalidateTag } from "next/cache";
export async function salvarProduto(dados: FormData) {
await db.produto.create({ data: ... });
revalidateTag("catalogo-produtos"); // Atualiza apenas o cache desta tag!
}
⚠️ 4. Armadilhas Comuns e Anti-Padrões de Produção
- Falta de Validação em Server Actions: Server Actions são endpoints públicos da internet! Nunca confie cegamente nos dados de
FormData. Sempre valide os tipos com Zod antes de persistir no banco. - Vazamento de Dados em Respostas: Retornar instâncias de entidades brutas com senhas hash ou metadados de auditoria interna nas Server Actions expõe dados sensíveis no tráfego RPC.
💡 5. Diretrizes de Engenharia (Meta & React Docs)
- Adote Metadata API para SEO Perfeito: Exporte objetos
metadataou funçõesgenerateMetadatadinâmicas para gerar tags OpenGraph e Twitter Cards sob demanda. - Prefira
revalidateTagarevalidatePath: A invalidação baseada em tags é semântica e desacoplada da estrutura de rotas da aplicação.
💻 6. Demonstração Arquitetural do Conceito
// actions/userActions.ts - Server Action com Zod e revalidação
"use server";
import { revalidateTag } from "next/cache";
import { z } from "zod";
const UserInputSchema = z.object({
email: z.string().email(),
role: z.enum(["admin", "user"])
});
export async function registerUserAction(formData: FormData) {
const result = UserInputSchema.safeParse({
email: formData.get("email"),
role: formData.get("role")
});
if (!result.success) {
return { success: false, errors: result.error.flatten() };
}
// Persiste no banco de dados corporativo
revalidateTag("users-list");
return { success: true };
}
📋 7. Cheat-Sheet de Caching e Invalidação
fetch(url, { cache: 'no-store' }): Força busca dinâmica a cada requisição (SSR puro).fetch(url, { next: { revalidate: 60 } }): Revalidação incremental (ISR) a cada 60 segundos.revalidateTag(tag): Purga o cache associado à tag sob demanda.
🔍 8. Diagnóstico de Performance & React DevTools Profiler
Validação de Headers de Cache:
- Verificação de HIT/MISS: Inspecione os headers HTTP
x-nextjs-cacheno Chrome DevTools:HITindica dado servido instantaneamente da memória, eSTALEindica revalidação assíncrona em background (SWR).
🧪 9. Casos de Teste e Cenários de Borda Recomendados
- 🔍 Invalidação de Tag Inexistente: Assegure que invocar
revalidateTag()com identificador incorreto não derrube o worker Node.js. - 🔍 CSRF Protection: Valide se o Next.js rejeita invocações de Server Actions com headers de origem adulterados.
- 🔍 Concorrência de Mutações: Simule múltiplos usuários submetendo formulários simultaneamente com a mesma tag de cache.