{articulo.titulo}
Por {articulo.autor} el {articulo.fecha}
{articulo.contenido}
Lección 3 de 17 · Lectura y práctica
Tipo de lección: VideoConcepto claveLos 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.
Del concepto a la práctica
Una página de servidor puede consultar datos y construir una vista sin convertir la consulta en estado del navegador. Trabajaremos con una función local determinista que devuelve dos artículos, para observar la separación entre obtención y presentación.
const articles = [
{ title: 'Caché', author: 'Nora' },
{ title: 'Rutas', author: 'Luis' }
]
export default async function Page() {
return <main><ul>{articles.map(a => <li key={a.title}>{a.title} — {a.author}</li>)}</ul></main>
}La salida visible contiene Caché — Nora y Rutas — Luis; no hace falta useEffect.
Sustituye los datos por tres registros con title y author.
Renderiza una lista con una clave estable.
Añade un encabezado que indique el número de registros.
Verifica que el texto coincide con el array.
Error frecuente: usar useState para datos que no cambian durante el renderizado. Corrígelo manteniendo la colección en el servidor. Resultado esperado: tres filas y un encabezado con 3 artículos; cada fila conserva exactamente el título y autor de su registro.
Los dos títulos son únicos únicamente en este fixture. Si aceptas títulos repetidos usa id estable como key, por ejemplo a1, a2 y a3. Comprueba también []: el encabezado indica 0 artículos y una frase explica que no hay registros. Este array local demuestra renderizado, no una consulta remota; mide solicitudes de red solo cuando reemplaces la función por una fuente real.

Mapa de prácticaEl servidor puede obtener datos y producir el HTML inicial. El navegador muestra el resultado y ejecuta las interacciones que necesitan estado local. Mantén las claves sensibles en el servidor y define qué parte se ejecuta en cada entorno.
Ver la infografía en tamaño completo ↗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.
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.
01 / ELEGIR UNA RUTA
El próximo paso
Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.