Routing: Fundamentos
NextJS usa un sistema de rutas basado en archivos. Cada carpeta dentro de app/ puede ser una ruta si tiene un page.tsx.
Convenciones de archivos
| Archivo | Para que sirve |
|---|---|
page.tsx | Define la UI de la ruta. Sin este archivo, la ruta no existe |
layout.tsx | Envuelve a las paginas hijas. Persiste entre navegaciones |
loading.tsx | UI de carga (se muestra mientras el contenido carga) |
error.tsx | UI de error (captura errores de la ruta) |
not-found.tsx | UI para 404 |
route.ts | API endpoint (no puede coexistir con page.tsx) |
Crear rutas
Cada carpeta con un page.tsx es una ruta:
plaintext
app/
├── page.tsx → /
├── blog/
│ └── page.tsx → /blog
├── productos/
│ ├── page.tsx → /productos
│ └── [id]/
│ └── page.tsx → /productos/123
└── contacto/
└── page.tsx → /contactotsx
// app/blog/page.tsx
export default function BlogPage() {
return (
<div>
<h1>Blog</h1>
<p>Lista de articulos</p>
</div>
)
}Route Groups
Si quieres organizar carpetas sin que afecten la URL, usa parentesis:
plaintext
app/
├── (marketing)/
│ ├── page.tsx → /
│ ├── about/
│ │ └── page.tsx → /about
│ └── layout.tsx # Layout solo para marketing
├── (dashboard)/
│ ├── panel/
│ │ └── page.tsx → /panel
│ └── layout.tsx # Layout solo para dashboardLas carpetas (marketing) y (dashboard) no aparecen en la URL, pero te permiten tener layouts separados.
Ejemplo real: e-commerce
Un e-commerce tipico organizado con route groups:
plaintext
app/
├── (tienda)/
│ ├── layout.tsx # Header con carrito + footer
│ ├── page.tsx → / (landing)
│ ├── productos/
│ │ ├── page.tsx → /productos
│ │ └── [slug]/
│ │ └── page.tsx → /productos/camiseta-azul
│ └── carrito/
│ └── page.tsx → /carrito
├── (admin)/
│ ├── layout.tsx # Sidebar de admin
│ ├── dashboard/
│ │ └── page.tsx → /dashboard
│ └── inventario/
│ └── page.tsx → /inventario
└── (auth)/
├── layout.tsx # Layout centrado, sin nav
├── login/
│ └── page.tsx → /login
└── registro/
└── page.tsx → /registroTres areas del sitio, tres layouts distintos, cero complejidad en las URLs.
Carpetas sin ruta
Si una carpeta no tiene page.tsx, no genera ruta. Esto es util para organizar componentes:
plaintext
app/
├── blog/
│ ├── page.tsx # Esta SI es una ruta
│ ├── _components/ # Esta NO es una ruta
│ │ ├── PostCard.tsx
│ │ └── SearchBar.tsx
│ └── [slug]/
│ └── page.tsxEl prefijo _ es una convencion comun pero no es obligatorio. Lo importante es que no tenga page.tsx.