Mejores prácticas de enrutamiento en Next.js
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de cada página en esta sección.
Busca en todas las páginas de la documentación
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de cada página en esta sección.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
const { id } = await params - la desestructuración sin await devuelve el objeto Promise y tus búsquedas silenciosamente devuelven undefined.page.tsx como route.tsx - el Route Handler sombreará la página, así que mantén las rutas API bajo app/api/ para evitar conflictos silenciosos.layout.tsx persiste a través de la navegación y su estado sobrevive a los cambios de ruta hija; cuando específicamente necesitas remontar (p. ej., reiniciar animaciones o estado en cada navegación), usa template.tsx en su lugar.const postId = Number(params.id) - así que convierte a la forma que realmente necesitas en lugar de confiar solo en la anotación de tipo.[...path] no coincide con la ruta padre, así que /docs es 404; cambia a [[...path]] o añade un page.tsx separado junto a él cuando el segmento base debe resolver./blog/about/page.tsx junto a [slug]/page.tsx sin conflicto.next build, así que cualquier fuente de datos no disponible falla la compilación; combínala con dynamicParams = true cuando las nuevas rutas aún deben renderizarse en la primera solicitud.error.tsx necesita la directiva "use client" - y solo captura errores debajo de sí, nunca en el layout.tsx hermano del mismo segmento.global-error.tsx reemplaza el layout raíz completo cuando se activa, así que debe renderizar su propio <html><body>; también ten en cuenta que solo se activa en producción (la superposición de desarrollo se ejecuta en desarrollo).try/catch circundante los traga - llámalos fuera de try/catch, o usa unstable_rethrow en el bloque catch para dejarlos propagarse.not-found.tsx captura automáticamente cualquier URL que no coincida con una ruta, mientras que los archivos not-found.tsx anidados solo se activan cuando explícitamente llamas a notFound() desde dentro de ese subárbol.searchParams; si un layout necesita estado de URL, levanta la lógica a una page o un Client Component que usa useSearchParams() dentro de un límite Suspense.useRouter, usePathname, y useSearchParams viven en next/navigation; next/router es el Pages Router y silenciosamente falla o es 404 cuando se importa.useSearchParams() sin un límite <Suspense> circundante opta toda la ruta al renderizado del lado del cliente - siempre delimítalo: <Suspense fallback={null}><SearchFilters /></Suspense>.router.push() devuelve void, así que envuelve navegaciones en useTransition - startTransition(() => router.push("/dashboard")) - para obtener una bandera isPending y deshabilitar botones o mostrar spinners durante cambios de ruta.refresh() vuelve a obtener datos del servidor para la ruta activa solo; otras rutas cacheadas permanecen obsoletas, así que combínala con revalidateTag/revalidatePath cuando la mutación afecta hermanos.<Link> prefetcha en la entrada del viewport y se desplaza hacia arriba por defecto - <Link href="/settings" prefetch={false} scroll={false}> - establece prefetch={false} en enlaces raramente usados y scroll={false} para UIs de pestaña/filtro que deben permanecer en su lugar.config.matcher tu middleware se ejecuta en cada solicitud incluyendo /_next/static y favicons - export const config = { matcher: ["/dashboard/:path*", "/api/:path*"] } - define el alcance explícitamente y excluye destinos de redirección para evitar bucles infinitos.bcrypt, fs, y la mayoría de drivers de base de datos se rompen en compilación o runtime - usa solo APIs Web y librerías compatibles con edge.NextResponse.next() no hace corto-circuito; debes return (o una redirección/reescritura) para realmente detener la cadena de middleware, de lo contrario la lógica subsecuente sigue ejecutándose.@slot deben incluir un fallback default.tsx, de lo contrario navegaciones duras o subrutas no coincidentes son 404; los slots también deben ser hijos directos del layout y no pueden anidar dentro uno del otro.(.), (..), (..)(..), y (...) cuentan los segmentos de grupos de ruta igual que las carpetas regulares, así que los grupos de ruta pueden requerir un salto (..) extra; la falta de default.tsx en el slot anfitrión también rompe el cierre de back-navigation.(group) no pueden resolver a la misma ruta de URL (la compilación falla), y múltiples layouts raíz fuerzan una recarga de página completa entre grupos en lugar de navegación suave - mantén la ruta del inicio / en exactamente un grupo.Revisado por Chris St. John·Última actualización: 19 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥