Streaming React

Carregamento progressivo com limites Suspense que transmite conteúdo conforme fica disponível. Perfeito para Dashboards, aplicações em tempo real e Apps progressivos onde usuários se beneficiam de ver conteúdo incrementalmente.

Servidor

🌐
Request
Streaming
🖥️
Servidor recebe requisição
Servidor inicia renderização
Servidor renderiza conteúdo rápido
Servidor transmite chunk HTML 1
<Suspense>
Servidor renderiza conteúdo lento (Suspense)
Servidor transmite chunk HTML 2

Cliente

Cliente recebe e exibe chunk 1
Cliente recebe e exibe chunk 2
React.hydrateRoot()
Página interativa
Benefícios x Trade-offs

Benefits

  • Carregamento Progressivo: Conteúdo rápido aparece imediatamente
  • Melhor UX: Usuários veem conteúdo conforme fica disponível
  • Carregamento Paralelo: Múltiplos componentes carregam independentemente
  • Limites de Erro: Tratamento de erro isolado por componente

Trade-offs

  • UI incremental: Layout pode mudar conforme conteúdo carrega
  • Fallback UX necessário: Deve projetar estados de carregamento
  • Complexidade: Gerenciar múltiplos limites Suspense
  • Considerações SEO: Algum conteúdo carrega após render inicial
Como implementar?

Streaming usa limites Suspense com Server Components assíncronos. Não pode usar hooks em limites Suspense.

import { Suspense } from "react";

export default async function StreamingPage() {
  return (
    <div>
      <Suspense fallback={<div>Carregando...</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>;
}
  • Componentes são funções assíncronas (sem diretiva 'use client')
  • Não pode usar hooks React (incluindo use hook) em Server Components
  • Envolva componentes assíncronos com Suspense e forneça fallback
  • Use loading.js para estados de carregamento no nível de rota
  • Conteúdo transmite para o cliente conforme fica disponível