{articulo.titulo}
Por {articulo.autor} el {articulo.fecha}
{articulo.contenido}
Tipo de lección: Video
Los Server Components en Next.js 15 representan un cambio fundamental en cómo construimos aplicaciones web. A diferencia de los componentes de React tradicionales que se renderizan en el cliente, estos componentes se ejecutan exclusivamente en el servidor. Imagina que estás construyendo un dashboard financiero: en lugar de enviar todo el código y datos al navegador para que el usuario espere mientras se procesa, el servidor prepara la interfaz completa y envía solo el HTML final. Esto reduce drásticamente el tamaño del bundle JavaScript y mejora el rendimiento inicial.
El App Router es la nueva estructura de enrutamiento basada en el sistema de archivos. Cada carpeta dentro de app representa una ruta, y los archivos como page.js definen el contenido. Cuando combinas esto con Server Components, obtienes una arquitectura donde el servidor puede renderizar páginas completas sin necesidad de JavaScript en el cliente para el contenido estático. Piensa en ello como un restaurante: el cliente (navegador) recibe el plato ya cocinado (HTML renderizado), en lugar de los ingredientes crudos (código y datos) que tendría que preparar.
Los Server Components no pueden usar hooks como useState o useEffect, ya que no se ejecutan en el cliente. Esto los hace ideales para tareas pesadas como consultas a bases de datos o procesamiento de datos.
Vamos a crear una página simple que muestre una lista de productos desde una API. Primero, en tu proyecto Next.js 15, navega a la carpeta app y crea una nueva carpeta llamada productos. Dentro, crea un archivo page.js. Este será nuestro Server Component.
// app/productos/page.js
export default async function ProductosPage() {
// Esta función se ejecuta en el servidor
const response = await fetch('https://api.ejemplo.com/productos');
const productos = await response.json();
return (
Lista de Productos
{productos.map((producto) => (
{producto.nombre} - ${producto.precio}
))}
);
}Observa que usamos async/await directamente en el componente. Esto es posible porque se ejecuta en el servidor. El HTML generado se enviará al cliente, y si habilitas Streaming SSR, los datos pueden cargarse progresivamente. Para probarlo, ejecuta npm run dev y visita http://localhost:3000/productos. Verás la lista renderizada sin JavaScript en el cliente para los datos.
Supongamos que estás construyendo un blog con Next.js 15. Quieres mostrar artículos desde una base de datos, con información como título, autor y fecha. Usando Server Components, puedes optimizar esto para SEO y rendimiento.
| Componente | Tipo | Función |
|---|---|---|
| ArticleList | Server Component | Obtiene artículos desde la DB y renderiza la lista |
| ArticleItem | Server Component | Muestra detalles de un artículo |
| LikeButton | Client Component | Maneja interacciones del usuario |
En app/blog/page.js, defines un Server Component que consulta la base de datos:
import { db } from '@/lib/db';
export default async function BlogPage() {
const articulos = await db.articulos.findMany();
return (
{articulos.map((articulo) => (
{articulo.titulo}
Por {articulo.autor} el {articulo.fecha}
{articulo.contenido}
))}
);
}Esto asegura que el contenido sea indexable por motores de búsqueda y se cargue rápidamente, ya que no depende de JavaScript en el cliente.
useState o useEffect causará un error. Solución: Mueve la lógica interactiva a un Client Component usando 'use client'.try-catch o configura opciones de fetch con next: { revalidate: 60 } para caching.async/await correctamente y manejar estados de carga con Suspense si es necesario.app, puede romper el enrutamiento. Sigue la convención de carpetas.Suspense para mejorar la experiencia de usuario.page.js.En este ejercicio, construirás una página de perfil de usuario que muestre información estática desde una API simulada, utilizando Server Components en Next.js 15. Sigue estos pasos:
npx create-next-app@latest y selecciona las opciones por defecto.app, crea una nueva carpeta llamada perfil.app/perfil, crea un archivo page.js. Este será tu Server Component.page.js, define una función asíncrona que use fetch para obtener datos de https://jsonplaceholder.typicode.com/users/1 (una API de prueba).h1 y p.try-catch, mostrando un mensaje de error si falla.npm run dev y verifica que la página http://localhost:3000/perfil muestre los datos correctamente.'use client' y prueba la integración.Error al cargar el perfil
en el catch.Completa el quiz interactivo de arriba para ganar XP.