Componentes del Servidor React (RSC)

Componentes solo del servidor para rendimiento optimizado, predeterminado en App Router. Ideal para Apps modernas, aplicaciones con muchos datos y Apps seguros que requieren lógica del lado del servidor.

Servidor

🌐
Request
Response
🖥️
Servidor recibe solicitud
Servidor obtiene datos
React.renderToReadableStream()
Servidor renderiza Server Components
Servidor serializa payload RSC
Servidor envía payload RSC

Cliente

Cliente recibe payload RSC
React.hydrateRoot()
Cliente hidrata componentes
Página interactiva
Beneficios x Trade-offs

Benefits

  • Rendimiento Optimizado: Componentes del servidor + cliente
  • Acceso Seguro a Datos: Obtención de datos del lado del servidor
  • Tamaño de Bundle Reducido: Menos JavaScript al cliente
  • Mejor SEO: Contenido renderizado en el servidor

Trade-offs

  • División de interactividad: Necesita elegir servidor vs cliente
  • Paso de hidratación: Los componentes cliente necesitan hidratación
  • Curva de aprendizaje: Entender límites servidor/cliente
  • Límites de serialización: No se pueden pasar funciones/clases
¿Cómo implementar?

RSC usa Server Components por defecto en App Router. Los Server Components no pueden importar Client Components.

// Server Component (por defecto)
export default async function ServerComponent() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();

  return (
    <div>
      <h1>{data.title}</h1>
      <ClientComponent data={data} />
    </div>
  );
}

// Client Component (cuando se necesita)
"use client";
import { useState } from "react";

export function ClientComponent({ data }: { data: any }) {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
  • Los Server Components son funciones asíncronas (por defecto, sin directiva necesaria)
  • No se pueden usar hooks React en Server Components
  • Agrega directiva 'use client' solo cuando necesites interactividad
  • Los Server Components pueden obtener datos directamente, los Client Components usan hooks