Lección 2 de 17 · Lectura y práctica
Diferencias entre Server y Client Components
Concepto claveEn Next.js 15, los Server Components y Client Components representan dos paradigmas fundamentales para construir aplicaciones full-stack. Los Server Components se renderizan exclusivamente en el servidor, lo que.
Del concepto a la práctica
Taller de esta lección
La decisión entre servidor y cliente depende de la capacidad necesaria, no de una preferencia de estilo. Un panel que recibe artículos desde el servidor no necesita estado local. Un selector de categoría que cambia visualmente sin nueva navegación sí necesita interacción y puede aislarse como Client Component.
Ejemplo resuelto
// app/articulos/CategoryFilter.tsx
'use client'
import { useState } from 'react'
export default function CategoryFilter() {
const [category, setCategory] = useState('todos')
return <button onClick={() => setCategory('frontend')}>{category}</button>
}El componente servidor puede renderizar el listado y colocar este filtro como hoja interactiva.
Pruébalo
Marca
ArticleListcomo componente de servidor por defecto.Aísla solo el botón que cambia la categoría.
Pasa una cadena de categoría como prop, no una conexión de base de datos.
Comprueba que el botón cambia de
todosafrontend.
Comprueba tu resultado
Error frecuente: añadir use client a toda la página para resolver un único clic. Corrígelo moviendo el estado al componente pequeño. Resultado esperado: el filtro cambia su texto al pulsar y el componente que carga datos no usa hooks del navegador ni expone credenciales.
El botón todavía no filtra registros
Este componente comprueba estado y clic: cambia una etiqueta, pero no aplica una categoría al listado preparado en servidor. Para filtrar de verdad, pasa artículos serializables a una isla cliente que derive filas visibles o navega con un parámetro de búsqueda y vuelve a consultar en servidor. No importes el módulo de base de datos desde un archivo con use client. La frontera importa a partir de sus importaciones: un componente cliente también puede recibir contenido servidor como children. En la primera carga puede producirse HTML de componentes cliente antes de la hidratación; cliente no significa que no haya HTML inicial.

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 ↗Fuentes para profundizar
Concepto clave
En Next.js 15, los Server Components y Client Components representan dos paradigmas fundamentales para construir aplicaciones full-stack. Los Server Components se renderizan exclusivamente en el servidor, lo que significa que su código JavaScript nunca se envía al navegador. Esto permite acceder directamente a bases de datos, APIs internas y sistemas de archivos sin exponer credenciales o lógica sensible.
Por otro lado, los Client Components son componentes React tradicionales que se renderizan en el cliente, permitiendo interactividad, manejo de estado y uso de hooks como useState o useEffect. Una analogía útil es pensar en un restaurante: los Server Components son la cocina (donde se prepara la comida con ingredientes crudos y equipamiento especializado), mientras que los Client Components son el comedor (donde los comensales interactúan con la comida ya preparada).
Los Server Components reducen el bundle size enviado al cliente hasta en un 70% en aplicaciones típicas, mejorando significativamente el rendimiento.
Cómo funciona en la práctica
Para definir un Server Component en Next.js 15, simplemente creas un archivo .jsx o .tsx en el App Router. Por defecto, todos los componentes son Server Components a menos que se marquen explícitamente como clientes. Para convertir un componente en Client Component, debes agregar la directiva 'use client' en la primera línea del archivo.
Veamos un ejemplo paso a paso:
- Crea un componente
ProductList.server.jsxque obtenga datos desde una base de datos:
// Este es un Server Component
async function ProductList() {
const products = await db.products.findMany();
return (
{products.map(product => (
- {product.name}
))}
);
}- Crea un componente
AddToCart.client.jsxcon interactividad:
'use client';
// Este es un Client Component
import { useState } from 'react';
export default function AddToCart({ productId }) {
const [quantity, setQuantity] = useState(1);
const handleAdd = () => {
// Lógica para agregar al carrito
console.log(`Agregando ${quantity} unidades del producto ${productId}`);
};
return (
setQuantity(parseInt(e.target.value))}
/>
);
}Caso de estudio
Imagina que estás construyendo un dashboard de e-commerce con Next.js 15. La página principal necesita mostrar:
| Elemento | Tipo de Componente | Justificación |
|---|---|---|
| Lista de productos | Server Component | Requiere acceso a base de datos para obtener información actualizada de inventario |
| Filtros interactivos | Client Component | Necesita manejar estado local para selecciones del usuario |
| Carrito de compras | Client Component | Requiere interactividad y persistencia en el navegador |
| Recomendaciones personalizadas | Server Component | Utiliza algoritmos complejos que procesan datos sensibles del usuario |
En este escenario, los Server Components manejan toda la lógica de datos y los Client Components se encargan de la experiencia interactiva. Esto optimiza el rendimiento porque solo se envían al cliente los componentes que realmente necesitan interactividad.
Errores comunes
- Intentar usar hooks de React en Server Components: Los Server Components no pueden usar
useState,useEffectu otros hooks. Solución: Mueve la lógica que requiere hooks a un Client Component separado. - Mezclar lógica de servidor y cliente en el mismo componente: Esto causa errores de hidratación. Solución: Mantén una separación clara, usando Server Components para datos y Client Components para interactividad.
- Olvidar la directiva 'use client': Si un componente necesita interactividad pero no tiene
'use client', Next.js lo tratará como Server Component y fallará. Solución: Siempre verifica que los componentes interactivos tengan la directiva. - Sobrecargar Client Components con lógica de datos: Esto aumenta innecesariamente el bundle size. Solución: Pasa datos como props desde Server Components en lugar de fetchear dentro de Client Components.
- No aprovechar Streaming SSR: Next.js 15 permite streaming de Server Components. Solución: Usa
Suspensepara envolver componentes que cargan datos y mostrar fallbacks mientras se cargan.
Checklist de dominio
- Puedo explicar la diferencia fundamental entre Server y Client Components sin consultar documentación
- Sé cuándo usar cada tipo de componente basándome en los requisitos de interactividad y acceso a datos
- Puedo identificar y corregir errores comunes relacionados con la mezcla de lógica de servidor y cliente
- Implemento correctamente la directiva
'use client'donde sea necesario - Optimizo el bundle size utilizando Server Components para contenido estático y Client Components solo para interactividad
- Utilizo props para pasar datos desde Server Components a Client Components de manera eficiente
- Aprovecho Streaming SSR con
Suspensepara mejorar la experiencia de usuario
Migracion de componente tradicional a arquitectura Server/Client
En este ejercicio, migraras un componente React tradicional a la arquitectura de Server y Client Components de Next.js 15.
- Descarga el archivo
ProductPage.traditional.jsxque contiene un componente que:- Obtiene datos de producto desde una API
- Muestra informacion del producto
- Incluye un contador interactivo para cantidad
- Tiene un boton "Agregar al carrito" con manejo de clicks
- Analiza el componente y separa la logica en dos archivos:
ProductInfo.server.jsx: Debe contener solo la obtencion y renderizado de datos del productoProductActions.client.jsx: Debe contener el contador y el boton interactivo
- En el archivo principal
page.jsx, importa ambos componentes y asegurate de pasar los datos del producto como props desde el Server Component al Client Component - Verifica que el bundle final sea mas pequeno que el componente original
Pistas
- Recuerda que los Server Components pueden ser async y usar await directamente
- Usa la directiva 'use client' solo en el componente que necesita interactividad
- Pasa el productId como prop desde el Server Component al Client Component para las acciones
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con Next.js 15: Aplicaciones Full-Stack con Server Components y Streaming SSR
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.