React Server Components (RSC) han cambiado fundamentalmente la forma en que construimos aplicaciones React. Al mover la lógica de renderizado al servidor, podemos reducir significativamente el paquete de JavaScript enviado al cliente, lo que lleva a tiempos de carga más rápidos y mejores experiencias de usuario. En este artículo, exploraremos patrones avanzados y mejores prácticas para aprovechar los RSC en 2026.
¿Qué son los Server Components?
Tradicionalmente, los componentes de React se renderizaban completamente en el cliente (CSR) o se pre-renderizaban en el servidor como HTML (SSR) y luego se hidrataban en el cliente. Los Server Components nos permiten renderizar componentes exclusivamente en el servidor. Su código nunca se envía al navegador.
Los Beneficios
- Tamaño de Paquete Cero: Las dependencias utilizadas en Server Components (como analizadores de markdown o bibliotecas de fechas pesadas) permanecen en el servidor.
- Acceso Directo al Backend: Puedes consultar tu base de datos directamente dentro de tu componente sin exponer puntos finales de API.
- Code Splitting Automático: Los componentes cliente importados del lado del servidor se dividen automáticamente.
Patrón de Obtención de Datos
Con RSC, puedes hacer que tus componentes sean async y esperar datos directamente.
// app/users/page.tsx import { db } from '@/lib/db'; export default async function UsersPage() { const users = await db.user.findMany(); return ( <main> <h1>Usuarios</h1> <ul> {users.map((user) => ( <li key={user.id}>{user.name}</li> ))} </ul> </main> ); }
Suspense para Streaming
Dado que la obtención de datos puede ser lenta, envuelve tus componentes en <Suspense> para mostrar una interfaz de usuario alternativa inmediatamente mientras se cargan los datos.
import { Suspense } from 'react'; import UserList from './UserList'; import LoadingSkeleton from './LoadingSkeleton'; export default function Page() { return ( <section> <h1>Mis Usuarios</h1> <Suspense fallback={<LoadingSkeleton />}> <UserList /> </Suspense> </section> ); }
Combinando Server y Client Components
Uno de los aspectos más confusos es cómo combinar componentes de Servidor y Cliente.
Regla de Oro: Los Server Components pueden importar Client Components. Los Client Components no pueden importar Server Components directamente. Sin embargo, puedes pasar un Server Component como children a un Client Component.
El Patrón "Children"
// ClientComponent.tsx 'use client'; import { useState } from 'react'; export default function ClientWrapper({ children }) { const [count, setCount] = useState(0); return ( <div onClick={() => setCount((c) => c + 1)}> Cuenta: {count} {children} {/* ¡Esto puede ser un Server Component! */} </div> ); }
// ServerPage.tsx import ClientWrapper from './ClientWrapper'; import ServerContent from './ServerContent'; export default function Page() { return ( <ClientWrapper> <ServerContent /> {/* Esto funciona perfectamente */} </ClientWrapper> ); }
Errores Comunes
- Usar Contexto en Server Components: El Contexto es un concepto del lado del cliente. Si necesitas compartir datos del lado del servidor, pásalos como props o usa una caché especializada de alcance de solicitud.
- Agregar Controladores de Eventos: No puedes agregar
onClickuonChangea un Server Component. Esa lógica pertenece a un nodo hoja genérico de Client Component.
Conclusión
React Server Components no son solo una característica; son un cambio de paradigma. Al comprender el límite entre servidor y cliente, puedes construir aplicaciones que sean altamente interactivas e increíblemente rápidas.