{post.title}
{post.content}

Un router es el sistema que determina cómo se manejan las URLs de tu aplicación y qué componentes se renderizan cuando el usuario accede a una ruta específica. En Next.js, cada archivo dentro de las carpetas de routing corresponde automáticamente a una ruta en tu aplicación. Por ejemplo, si creas un archivo about.js dentro de /pages, este será accesible en /about.
El router es fundamental porque define la estructura de navegación, los layouts (diseños compartidos), la gestión de estados de carga y la optimización del rendimiento de tu aplicación. Elegir el router adecuado desde el inicio de un proyecto te ahorrará refactorizaciones costosas más adelante.
El Pages Router ha sido el sistema de enrutamiento de Next.js desde sus inicios. Utiliza el directorio /pages donde cada archivo representa una ruta. Este enfoque es intuitivo y fácil de entender: simplemente creas archivos y obtienes rutas automáticamente.
.js, .jsx, .ts o .tsx en /pages se convierte en una ruta.useEffect y useState directamente./pages/api.// pages/index.js
export default function Home() {
return (
Bienvenido a mi sitio
Usando Pages Router
);
}
// pages/about.js
export default function About() {
return (
Acerca de nosotros
Página estática con Pages Router
);
}
// pages/blog/[slug].js - Ruta dinámica
export default function BlogPost({ post }) {
return (
{post.title}
{post.content}
);
}
export async function getStaticPaths() {
const posts = await fetchPosts();
return {
paths: posts.map((post) => ({
params: { slug: post.slug },
})),
fallback: false,
};
}
export async function getStaticProps({ params }) {
const post = await fetchPostBySlug(params.slug);
return { props: { post } };
}El App Router (introducido en Next.js 13 como beta y estabilizado en Next.js 14) revoluciona la forma de construir aplicaciones. Utiliza el directorio /app y aprovecha los React Server Components (RSC), permitiendo renderizado híbrido y optimizado.
// app/layout.js - Layout raíz
export default function RootLayout({ children }) {
return (
{children}
Hablar por WhatsApp
);
}
// app/page.js - Página de inicio
export default function Home() {
return (
Bienvenido a mi sitio
Usando App Router con React Server Components
);
}
// app/blog/[slug]/page.js - Ruta dinámica
export default async function BlogPost({ params }) {
const post = await fetchPostBySlug(params.slug);
return (
{post.title}
{post.content}
);
}
// app/blog/[slug]/loading.js - Estado de carga
export default function Loading() {
return Cargando artículo...;
}
// app/blog/[slug]/error.js - Manejo de errores
export default function Error({ error }) {
return Error: {error.message};
}
// app/api/posts/route.js - API Route (opcional en App Router)
export async function GET() {
const posts = await fetchPosts();
return Response.json(posts);
}
// app/actions.js - Server Actions
export async function createPost(formData) {
'use server';
const title = formData.get('title');
await savePost({ title });
revalidatePath('/blog');
}/pages y /app coexistiendo, aunque esto no es recomendado para nuevos proyectos. La carpeta /app tiene prioridad sobre /pages.| Característica | Pages Router | App Router |
|---|---|---|
| Directorio | /pages | /app |
| Renderizado por defecto | Cliente (CSR) | Servidor (RSC) |
| Componentes de servidor | No disponibles | Soportados nativamente |
| Obtención de datos | getStaticProps, getServerSideProps | async/await directo en componentes |
| Layouts anidados | Limitado (usando _app.js) | Native y flexibles |
| Manejo de estados de carga | Componentes Loading convencionales | loading.js por ruta |
| Server Actions | No disponibles | Soportadas |
| Tamaño del bundle | Mayor (más JavaScript al cliente) | Menor (server components no se envían) |
| Caché de datos | Configuración manual | Configuración simple con fetch |
| Middleware | Requiere configuración adicional | Integrado con matcher |
| SEO | Bueno para páginas estáticas | Mejorado con server components |
| Curva de aprendizaje | Baja | Moderada (nuevos conceptos) |
Si decides migrar tu proyecto existente, aquí te explico el proceso general:
/app junto a tu /pages existente./pages a /app con el mismo nombre./app/layout.js con el contenido del layout raíz./app/layout.js con el HTML completo./app/api/[ruta]/route.js con handlers GET, POST, etc.loading.js, error.js donde sea necesario./pages.Durante la migración, puedes ejecutar ambos routers simultáneamente para validar funcionalidades incrementalmente.
Los React Server Components (RSC) son una de las características más revolucionarias del App Router. Aquí algunos puntos clave:
Para convertir un Server Component a Client Component, simplemente añade 'use client' al inicio del archivo. Sin embargo, hazlo solo cuando sea necesario, ya que esto incluye el componente en el bundle del cliente.
Veamos cómo difiere la obtención de datos entre ambos routers con un ejemplo real de una lista de productos:
// pages/products/index.js
import useSWR from 'swr';
function ProductsPage() {
const { data, error } = useSWR('/api/products', fetcher);
if (error) return Error al cargar productos;
if (!data) return Cargando...;
return (
{data.map(product => (
- {product.name}
))}
);
}
// pages/api/products.js
export default async function handler(req, res) {
const products = await db.getProducts();
res.status(200).json(products);
}// app/products/page.js
async function ProductsPage() {
// Obtención directa de datos - sin API route necesario
const products = await db.getProducts();
return (
{products.map(product => (
- {product.name}
))}
);
}
// Si necesitasmutaciones, usa Server Actions:
// app/actions.js
export async function createProduct(formData) {
'use server';
const name = formData.get('name');
await db.createProduct({ name });
revalidatePath('/products');
}El App Router puede proporcionar mejoras significativas en varias métricas:
"La elección del router no es solo una decisión técnica, es una declaración de cómo quieres construir y escalar tu aplicación."
Next.js está evolucionando rápidamente y el App Router es el centro de esta evolución. Las próximas características incluyen:
Ambas opciones son válidas y capaces de construir aplicaciones web modernas. Sin embargo, para la mayoría de los casos de uso modernos, el App Router es la elección recomendada porque:
La única razón válida para usar Pages Router es mantener un proyecto existente donde la migración no justifique el costo-beneficio. Para proyectos nuevos, App Router es el camino a seguir.
Pregunta 1: ¿Cuál es la principal ventaja de los React Server Components en el App Router?
Pregunta 2: ¿Puedes usar ambos routers (Pages y App) en el mismo proyecto?
/pages y /app) en el mismo proyecto. Cuando coexisten, el App Router tiene prioridad sobre el Pages Router. Esta característica es útil durante migraciones graduales.