Melhores Práticas de Dados do Next.js
Um resumo condensado das 25 melhores práticas mais importantes, extraídas de cada página desta seção.
Busque em todas as páginas da documentação
Um resumo condensado das 25 melhores práticas mais importantes, extraídas de cada página desta seção.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
await fetch(...) diretamente no corpo do Server Component em vez de usar useEffect - sem estado de carregamento, sem cascata do cliente e os dados são enviados como HTML.await retorna um objeto Promise (frequentemente renderizado como [object Promise]); sempre faça const { slug } = await params.const [user, posts] = await Promise.all([getUser(id), getPosts(id)]) - para que a latência total seja igual à chamada mais lenta em vez da soma, e deixe o TypeScript inferir a tupla de resultado gratuitamente.const a = await getA(); const b = await getB(); para dados independentes - as promises começam na criação, mas cada await ainda bloqueia a linha seguinte, produzindo latência sequencial.Promise.allSettled evita que uma única rejeição descarte os outros resultados bem-sucedidos e permite que você renderize uma página parcial.fetch, então envolva funções de banco de dados e ORM - const getUser = cache((id: string) => db.user.findUnique({ where: { id } })) - para obter deduplicação por renderização em layouts e páginas.cache: "no-store" em qualquer lugar de uma rota opta a rota inteira para renderização dinâmica; mova-o para um componente separado envolvido em <Suspense> para que o restante possa permanecer estático.cache: "auto" (não force-cache), então defina cache ou next.revalidate em cada fetch em vez de confiar no que o framework infere.fetch(url, { next: { tags: ["product-abc123"] } }) - use strings com namespace em vez de "data" genérico para que revalidateTag("product-abc123") não apague silenciosamente caches não relacionados.revalidatePath/revalidateTag marcam o cache como obsoleto para a próxima requisição - a resposta atual ainda retorna dados obsoletos, então use cache: "no-store" quando precisar de atualidade imediata.revalidatePath("/") atualiza apenas a página raiz; passe "layout" - revalidatePath("/dashboard", "layout") - para invalidar o layout mais todas as páginas filhas sob ele.unstable_cache(fn, keyParts, { tags, revalidate }) é a ferramenta - mas dê a cada chamada keyParts distintas e descritivas ou você retornará dados corrompidos de colisões de chaves.router.refresh() (ou ajuste experimental.staleTimes) para limpá-lo.redirect() lança um erro sentinela que o Next.js captura para realizar a navegação; envolver em try/catch engole o redirect, então coloque-o após sua mutação e fora de qualquer manipulador de erro.(prevState, formData) => Promise<State> e conecte-a através de useActionState para que o estado pendente e as mensagens de erro fluam pelo React de forma limpa.addOptimistic dentro de startTransition - startTransition(async () => { addOptimistic(newItem); await saveItem(newItem) }) - para que os usuários vejam a mudança instantaneamente e o sinalizador pendente ainda controle os estados desabilitados.<Suspense> para que os widgets sejam transmitidos à medida que resolvem; um único limite no nível superior bloqueia a página inteira na consulta mais lenta e derrota o streaming.error.tsx ou <ErrorBoundary>) no mesmo nível.useSearchParams() lança um erro durante a pré-renderização estática, então o componente que o lê deve estar dentro de um limite <Suspense> ou a compilação falhará.router.push; use router.replace para que o botão voltar retorne a uma página anterior significativa e também redefina page=1 sempre que a consulta mudar.const token = (await cookies()).get("session")?.value - e tocar em qualquer um deles torna a rota dinâmica; leia-os em um pequeno componente folha sob <Suspense> quando quiser que o restante da rota permaneça estático.cookies() é somente leitura em Server Components, então as escritas devem ocorrer em uma Server Action, Route Handler ou Middleware - (await cookies()).set("session", token, { httpOnly: true, secure: true, sameSite: "lax" }).async function* mais for await...of para manter apenas um lote em memória, compor com helpers de map/filter/take e lembre-se que geradores são apenas para servidor e de uso único.Revisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥