Melhores Práticas de Roteamento do Next.js
Um resumo condensado das 25 melhores práticas mais importantes, extraídas de todas as páginas 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 todas as páginas desta seção.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
const { id } = await params - desestruturar sem await retorna o objeto Promise e suas buscas retornarão silenciosamente undefined.page.tsx e route.tsx - o Route Handler sombreará a página, então mantenha as rotas de API em app/api/ para evitar conflitos silenciosos.layout.tsx persiste entre navegações e seu estado sobrevive a mudanças de rota filha; quando você precisar especificamente remontar (por exemplo, resetar animações ou estado a cada navegação), use template.tsx em vez disso.const postId = Number(params.id) - então converta para a forma que você realmente precisa em vez de confiar apenas na anotação de tipo.[...path] não corresponde à rota pai, então /docs retorna 404; mude para [[...path]] ou adicione um page.tsx separado ao lado dele quando o segmento base deve resolver.page.tsx em /blog/about/ ao lado de [slug]/page.tsx sem conflito.next build, então qualquer fonte de dados indisponível falha o build; combine-a com dynamicParams = true quando novos caminhos ainda devem renderizar na primeira requisição.error.tsx precisa da diretiva "use client" - e ele só captura erros abaixo de si mesmo, nunca no layout.tsx irmão no mesmo segmento.global-error.tsx substitui todo o layout raiz quando acionado, então ele deve renderizar seu próprio <html><body>; também note que ele só ativa em produção (o overlay de desenvolvimento roda em desenvolvimento).try/catch circundante os engole - chame-os fora de try/catch, ou use unstable_rethrow no bloco catch para deixá-los propagar.not-found.tsx raiz captura automaticamente qualquer URL que não corresponda a uma rota, enquanto arquivos not-found.tsx aninhados só disparam quando você chama explicitamente notFound() de dentro dessa subárvore.searchParams; se um layout precisar de estado de URL, eleve a lógica para uma página ou um Client Component que use useSearchParams() dentro de um limite Suspense.useRouter, usePathname e useSearchParams vivem em next/navigation; next/router é do Pages Router e falha silenciosamente ou retorna 404 quando importado.useSearchParams() sem um limite <Suspense> circundante opta toda a rota para renderização no lado do cliente - sempre proteja-o: <Suspense fallback={null}><SearchFilters /></Suspense>.router.push() retorna void, então envolva navegações em useTransition - startTransition(() => router.push("/dashboard")) - para obter uma flag isPending e desabilitar botões ou mostrar spinners durante mudanças de rota.refresh() re-busca dados do servidor apenas para a rota ativa; outras rotas em cache permanecem desatualizadas, então combine-o com revalidateTag/revalidatePath quando a mutação afetar irmãos.<Link> faz prefetch ao entrar na viewport e rola para o topo por padrão - <Link href="/settings" prefetch={false} scroll={false}> - defina prefetch={false} em links raramente usados e scroll={false} para UIs de abas/filtros que devem permanecer no lugar.config.matcher seu middleware executa em cada requisição incluindo /_next/static e favicons - export const config = { matcher: ["/dashboard/:path*", "/api/:path*"] } - escopo explicitamente e exclua destinos de redirecionamento para evitar loops infinitos.bcrypt, fs e a maioria dos drivers de banco de dados quebram no build ou em tempo de execução - use apenas Web APIs e bibliotecas compatíveis com edge.NextResponse.next() não causa curto-circuito; você deve return (ou um redirect/rewrite) para realmente parar a cadeia de middleware, caso contrário, a lógica subsequente continuará executando.@slot devem incluir um fallback default.tsx, caso contrário, navegações rígidas ou sub-rotas não correspondentes retornam 404; slots também devem ser filhos diretos do layout e não podem aninhar uns dentro dos outros.(.), (..), (..)(..) e (...) contam segmentos de grupos de rotas da mesma forma que pastas regulares, então grupos de rotas podem exigir um salto (..) extra; a falta de default.tsx no slot de hospedagem também quebra o descarte de navegação para trás.(group) não podem resolver para o mesmo caminho de URL (o build falha), e múltiplos layouts raiz forçam uma recarga completa da página entre os grupos em vez de navegação suave - mantenha a rota inicial / em exatamente um grupo.Revisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥