0Pricing
React Academy · Lezione

Streaming in React 18: come funziona renderToPipeableStream

Comprenda come renderToPipeableStream invia progressivamente blocchi HTML prima che tutti i dati asincroni siano disponibili.

Streaming in React 18: come funziona renderToPipeableStream è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Prima di React 18: il collo di bottiglia sincrono

Prima di React 18, il rendering lato server utilizzava renderToString, che è sincrono: React esegue il rendering dell'intero albero dei componenti in una stringa prima di inviare qualsiasi HTML al browser. Se un componente carica dati, il server deve attendere che tutti i dati siano disponibili prima che il primo byte raggiunga l'utente.

React 18: renderToPipeableStream

React 18 ha introdotto renderToPipeableStream, che esegue il rendering dell'albero dei componenti come flusso di blocchi HTML. Invece di attendere che tutto sia pronto, React invia l'HTML man mano che completa ogni parte dell'albero, consentendo al browser di iniziare immediatamente a visualizzare il contenuto visibile.

Anatomia: pipe e abort

renderToPipeableStream restituisce un oggetto con due metodi: pipe(writable) e abort(). pipe accetta un flusso Writable di Node.js, in genere la risposta HTTP, e avvia lo streaming dell'HTML al suo interno. abort() annulla il flusso e viene utilizzato quando la richiesta viene annullata o si supera un timeout.

Cosa viene trasmesso per primo: lo shell

Il flusso inizia con lo shell HTML, cioè tutto il contenuto che non è bloccato da un boundary Suspense in attesa. Include l'head del documento, la navigazione, il footer, la struttura del layout e qualsiasi contenuto disponibile sincronicamente. Lo shell viene trasmesso immediatamente, prima che vengano risolti i componenti dipendenti dai dati.

Fallback di Suspense nel flusso

I componenti all'interno dei boundary Suspense in attesa di dati vengono inizialmente trasmessi con la relativa UI di fallback (ad esempio, uno spinner di caricamento). In seguito React invia un tag script che sostituisce il fallback con il contenuto risolto, senza alcun nuovo rendering lato client dello shell.

bootstrapScripts per l'idratazione lato client

Passi bootstrapScripts: ['/static/js/client.js'] a renderToPipeableStream per indicare a React di inserire un tag script alla fine del flusso. Il browser carica questo bundle e chiama hydrateRoot, associando i gestori degli eventi di React al DOM renderizzato dal server.

onShellReady: il momento giusto per chiamare pipe

onShellReady viene eseguito quando lo shell HTML, cioè tutto ciò che si trova al di fuori dei boundary Suspense in attesa, è pronto per essere inviato. Questo è il momento corretto per chiamare pipe(res), ma è importante impostare il codice di stato HTTP e gli header della risposta prima di chiamare pipe, poiché lo streaming fissa il codice di stato HTTP.

Impostazione degli header prima dello streaming

Poiché lo streaming inizia immediatamente quando si chiama pipe(), qualsiasi assegnazione a res.setHeader o res.statusCode deve avvenire prima della chiamata a pipe. Un pattern comune consiste nell'impostare lo stato 200 e Content-Type: text/html nel callback onShellReady, quindi chiamare subito dopo pipe(res).

onShellError: errori fatali prima della shell

onShellError viene invocato quando si verifica un errore irreversibile prima che la shell abbia terminato il rendering, ad esempio quando un componente di primo livello genera un'eccezione al di fuori di qualsiasi confine Suspense. In questo caso non è possibile trasmettere una risposta parziale; è invece necessario reindirizzare a una pagina di errore o inviare un documento HTML statico di errore.

onAllReady: per bot e crawler

onAllReady viene invocato quando l'intero albero React è stato risolto, inclusi tutti i confini Suspense. Per i crawler dei motori di ricerca e i sistemi che generano anteprime dei link sui social media, è necessario inviare l'HTML completo senza streaming. Verifichi se la richiesta proviene da un bot e chiami pipe(res) in onAllReady invece che in onShellReady.

Recupero dagli errori durante lo streaming

onError viene invocato per gli errori nei confini Suspense: React può continuare a trasmettere il resto della pagina mentre quel confine mostra la propria interfaccia di errore. Utilizzi onError per registrare l'errore nella pipeline di osservabilità senza interrompere lo streaming per l'utente.

onAllReady rispetto a onShellReady

Quando è opportuno usare onAllReady invece di onShellReady per iniziare a trasmettere la risposta?

Riepilogo della lezione

renderToPipeableStream è la primitiva di React 18 per il rendering SSR in streaming sui server Node.js. Trasmette immediatamente la shell HTML tramite onShellReady, completa i confini Suspense man mano che i dati vengono risolti e idrata il client tramite bootstrapScripts. Utilizzi onAllReady per bot e crawler, onShellError per gli errori fatali e imposti sempre gli header HTTP prima di chiamare pipe().

Domande Frequenti

La lezione «Streaming in React 18: come funziona renderToPipeableStream» è gratuita?

Sì — il testo completo di «Streaming in React 18: come funziona renderToPipeableStream» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Streaming in React 18: come funziona renderToPipeableStream»?

Comprenda come renderToPipeableStream invia progressivamente blocchi HTML prima che tutti i dati asincroni siano disponibili. Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Streaming in React 18: come funziona renderToPipeableStream»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Streaming in React 18: come funziona renderToPipeableStream
  2. Confini Suspense e priorità dello streaming
  3. Idratazione progressiva con idratazione selettiva
  4. Misurare l’impatto dello streaming: FCP, TTI e LCP
← Torna a React Academy