Elementos del enrutamiento en Next.js
El App Router
En la versión 13 de Next.js, el App Router esta construido sobre React Server Components (Componentes de React de Servidor), los cuales permiten utilizar layouts compartidos, rutas anidadas, loading states, manejo de errores y más.
El App Router existe en el directorio app
que funciona conjuntamente con pages
, permitiendo así una migración progresiva desde este último.
El enrutamiento
app
toma prioridad sobrepages
, los directorios no deben resolver a la misma URL ya que esto generará un error.
Por default los componentes que se encuentran dentro de app
son Server Components (Componentes de Servidor). Esto es una característica que permite optimizar el performance, además también es posible utilizar los Client Components (Componentes de Cliente).
Roles de directorios y archivos
Next.js utiliza un sistema de enrutamiento basado en archivos en donde:
-
Los directorios son utilizados como rutas. Una ruta es un path a un directorio anidado, que utiliza un sistema de jerarquías que va desde el directorio raíz hasta el último archivo en el árbol.
-
Los archivos son usados para crear interfaces de usuario, que son mostradas en una ruta.
Segmentos de una ruta
Cada directorio representa un segmento de una ruta, cada segmento de ruta es mapeado a un segmento correspondiente de una dirección web.
acme.com/dashboard/settings
|- app
|- dashboard
|- settings
- app (Directorio raíz)
- dashboard (Segmento)
- settings (Hoja o segmento final)
Rutas anidadas
Para crear una ruta anidada, es necesario anidar directorios dentro de otros. Por ejemplo es posible crear la ruta /dashboard/settings anidando dos directorios: dashboard y dentro de este settings.
Convenciones de archivos
Next.js provee una lista de archivos especiales para crear una interfaz de usuario con un comportamiento específico en rutas anidadas:
Nombre | Descripción |
---|---|
layout | Interfaz de usuario compartida para un segmento y sus hijos. |
page | Interfaz de usuario única de una ruta que hace a la ruta de acceso público. |
loading | Interfaz de usuario para mostrar una precarga. |
not-found | Interfaz de usuario para mostrar contenido no encontrado. |
error | Interfaz de usuario para mostrar un error. |
global-error | Interfaz de usuario para mostrar un error global. |
route | Server-Side APi Endpoint. |
template | Specialized re-rendered Layout UI. |
default | Utilizado para Parallel Routes. |
Jerarquía de los componentes
Los componentes de React son definidos en archivos especiales de un segmento de ruta son rendereados con una jerarquía específica.
- layout.js
- template.js
- error.js
- loading.js
- not-found.js
- page.js o layout.js anidado.
<Layout>
<Template>
<ErrorBoundary fallback={<Error />}>
<Suspense fallback={<Loading />}>
<ErrorBoundary fallback={<NotFound />}>
<Page />
</ErrorBoundary>
</Suspense>
</ErrorBoundary>
</Template>
</Layout>
En las rutas anidadas, los componentes de un segmento se anidan dentro de los componentes de su padre.
- dashboard
- layout.js
- error.js
- loading.js
- settings
- layout.js
- error.js
- loading.js
- page.js
<Layout>
<ErrorBoundary fallback={<Error />}>
<Suspense fallback={<Loading />}>
<Layout>
<ErrorBoundary fallback={<Error />}>
<Suspense fallback={<Loading />}>
<Page />
</Suspense>
</ErrorBoundary>
</Layout>
</Suspense>
</ErrorBoundary>
</Layout>
Colocación
Además de los archivos especiales, es posible colocar tus propios archivos (componentes, estilos, pruebas, etc.) dentro del directorio app
.
Esto ya que las rutas se definen por directorios, pero solo aquellos con un archivo page.js
o route.js
son desplegados por Next.js.
- app
- components
- buttons.js // no se muestra
- lib
- constants.js // no se muestra
- dashboard
- page.js // visible
- nav.js // no se muestra
- api
- route.js // visible
- db.js // no se muestra
Patrones de enrutamiento avanzado
El App Router también proporciona un conjunto de convenciones para ayudarte a implementar patrones de enrutamiento más avanzados. Estos incluyen:
Parallel Routes (Rutas Paralelas): Te permiten mostrar simultáneamente dos o más páginas en la misma vista que pueden ser navegadas de manera independiente. Puedes usarlas para vistas divididas que tienen su propia sub-navegación. Ej. Dashboards.
Intercepting Routes (Rutas de Intercepción): Te permiten interceptar una ruta y mostrarla en el contexto de otra ruta. Puedes usarlas cuando es importante mantener el contexto de la página actual. Ej. Ver todas las tareas mientras editas una tarea o expandir una foto en un feed.
Estos patrones te permiten construir interfaces de usuario más ricas y complejas, democratizando características que históricamente eran complejas para equipos pequeños y desarrolladores individuales de implementar.
Conclusiones
El enrutamiento en Next.js, especialmente con la introducción del App Router en la versión 13, ofrece una flexibilidad y eficiencia sin precedentes para la creación de aplicaciones web modernas. Al aprovechar los React Server Components, los desarrolladores pueden optimizar el rendimiento y la experiencia del usuario mediante el uso de componentes de servidor y cliente. La estructura basada en archivos y directorios facilita la organización y el mantenimiento del código, mientras que las convenciones y patrones avanzados como Parallel Routes e Intercepting Routes permiten la creación de interfaces de usuario complejas y ricas en funcionalidades. En resumen, Next.js proporciona un sistema de enrutamiento robusto y escalable que puede adaptarse a las necesidades de cualquier proyecto, desde aplicaciones simples hasta plataformas complejas, democratizando así el desarrollo de aplicaciones web de alta calidad.