Streaming React

Carga progresiva con límites Suspense que transmite contenido conforme está disponible. Perfecto para Dashboards, aplicaciones en tiempo real y Apps progresivos donde los usuarios se benefician de ver contenido incrementalmente.

Servidor

🌐
Request
Streaming
🖥️
Servidor recibe solicitud
Servidor inicia renderizado
Servidor renderiza contenido rápido
Servidor transmite chunk HTML 1
<Suspense>
Servidor renderiza contenido lento (Suspense)
Servidor transmite chunk HTML 2

Cliente

Cliente recibe y muestra chunk 1
Cliente recibe y muestra chunk 2
React.hydrateRoot()
Página interactiva
Beneficios x Trade-offs

Benefits

  • Carga Progresiva: Contenido rápido aparece inmediatamente
  • Mejor UX: Los usuarios ven contenido conforme está disponible
  • Carga Paralela: Múltiples componentes cargan independientemente
  • Límites de Error: Manejo de error aislado por componente

Trade-offs

  • UI incremental: El diseño puede cambiar conforme el contenido se carga
  • Fallback UX necesario: Debe diseñar estados de carga
  • Complejidad: Gestionar múltiples límites Suspense
  • Consideraciones SEO: Algún contenido se carga después del render inicial
¿Cómo implementar?

Streaming usa límites Suspense con Server Components asíncronos. No se pueden usar hooks en límites Suspense.

import { Suspense } from "react";

export default async function StreamingPage() {
  return (
    <div>
      <Suspense fallback={<div>Cargando...</div>}>
        <AsyncComponent />
      </Suspense>
    </div>
  );
}

async function AsyncComponent() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();
  return <div>{data.message}</div>;
}
  • Los componentes son funciones asíncronas (sin directiva 'use client')
  • No se pueden usar hooks React (incluido use hook) en Server Components
  • Envuelve componentes asíncronos con Suspense y proporciona fallback
  • Usa loading.js para estados de carga a nivel de ruta
  • El contenido se transmite al cliente conforme está disponible