0Pricing
React Academy · レッスン

React 18のストリーミング:renderToPipeableStreamの仕組み

すべての非同期データが解決する前にrenderToPipeableStreamがHTMLチャンクを段階的にフラッシュする仕組みを理解します。

「React 18のストリーミング:renderToPipeableStreamの仕組み」はCoddyKit上の無料React Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

React 18 より前:同期処理のボトルネック

React 18 より前は、サーバーサイドレンダリングに同期的な renderToString が使用されていました。React はブラウザーに HTML を送信する前に、コンポーネントツリー全体を文字列にレンダリングします。いずれかのコンポーネントがデータを読み込む場合、最初のバイトがユーザーに届くまで、サーバーはすべてのデータを待たなければなりません。

React 18:renderToPipeableStream

React 18 では、コンポーネントツリーを HTML チャンクのストリームとしてレンダリングする renderToPipeableStream が導入されました。すべての準備が整うまで待つ代わりに、React はツリーの各部分の準備ができ次第 HTML を送信するため、ブラウザーは表示可能なコンテンツのレンダリングをすぐに開始できます。

構造:pipe と abort

renderToPipeableStream は、pipe(writable) と abort() という 2 つのメソッドを持つオブジェクトを返します。pipe は Node.js の Writable ストリーム(通常は HTTP レスポンス)を受け取り、そこへの HTML のストリーミングを開始します。abort() はストリームをキャンセルします。リクエストがキャンセルされた場合やタイムアウトを超過した場合に使用します。

最初にストリームされるもの:シェル

ストリームは HTML シェルから始まります。これは、保留中の Suspense 境界によってブロックされていないすべてのコンテンツです。ドキュメントの head、ナビゲーション、フッター、レイアウトの外枠、および同期的に利用可能なコンテンツが含まれます。シェルはデータに依存するコンポーネントが解決される前に、すぐにストリームされます。

ストリーム内の Suspense フォールバック

データを待機している Suspense 境界内のコンポーネントは、最初はフォールバック UI(例:読み込みスピナー)としてストリームされます。その後 React は、フォールバックを解決済みのコンテンツに置き換える script タグを送信します。これらはすべて、クライアント側でシェルを再レンダリングすることなく行われます。

クライアントのハイドレーション用 bootstrapScripts

renderToPipeableStream に bootstrapScripts: ['/static/js/client.js'] を渡すと、ストリームの末尾に script タグを挿入するよう React に指示できます。ブラウザーはこのバンドルを読み込み、hydrateRoot を呼び出して、サーバーでレンダリングされた DOM に React のイベントハンドラーを関連付けます。

onShellReady:pipe を実行する適切なタイミング

onShellReady は、HTML シェル(保留中の Suspense 境界の外側にあるすべての部分)の送信準備が整ったときに発火します。このタイミングで pipe(res) を呼び出すのが適切です。ただし重要なのは、ストリーミングによって HTTP ステータスが確定するため、pipe を呼び出す前に HTTP ステータスコードとレスポンスヘッダーを設定することです。

ストリーミング前のヘッダー設定

pipe() を呼び出すとストリーミングが直ちに始まるため、res.setHeader や res.statusCode の設定は pipe() を呼び出す前に行う必要があります。一般的なパターンは、onShellReady コールバックでステータスを 200、Content-Type を text/html に設定し、その直後に pipe(res) を呼び出す方法です。

onShellError:シェル開始前の致命的なエラー

onShellError は、シェルのレンダリングが完了する前に回復不能なエラーが発生すると呼び出されます。たとえば、Suspense 境界の外側にあるトップレベルのコンポーネントが例外をスローした場合です。この場合、レスポンスの一部をストリーミングすることはできないため、エラーページへリダイレクトするか、静的なエラー HTML ドキュメントを送信します。

onAllReady:ボットとクローラー向け

onAllReady は、すべての Suspense 境界を含む React ツリー全体の解決が完了すると呼び出されます。検索エンジンのクローラーやソーシャルメディアのリンクプレビュー生成ツールには、ストリーミングせずに完全な HTML を送信します。リクエストがボットからのものかどうかを確認し、onShellReady ではなく onAllReady で pipe(res) を呼び出してください。

ストリーミング中のエラー回復

onError は Suspense 境界内のエラーに対して呼び出されます。React は、その境界がエラー UI にフォールバックしている間も、ページの残りの部分をストリーミングできます。onError を使ってエラーをオブザーバビリティパイプラインに記録し、ユーザー向けのストリームを中止しないようにしてください。

onAllReady と onShellReady の比較

パイプ処理を開始する際、onShellReady ではなく onAllReady を使うのはどのような場合ですか?

レッスンのまとめ

renderToPipeableStream は、Node.js サーバー向けの React 18 のストリーミング SSR プリミティブです。onShellReady を介して HTML シェルを直ちにストリーミングし、データの解決に合わせて Suspense 境界を埋め、bootstrapScripts を使ってクライアントをハイドレーションします。ボットとクローラーには onAllReady を、致命的なエラーには onShellError を使い、必ず pipe() を呼び出す前に HTTP ヘッダーを設定してください。

よくある質問

「React 18のストリーミング:renderToPipeableStreamの仕組み」レッスンは無料ですか?

はい。「React 18のストリーミング:renderToPipeableStreamの仕組み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「React 18のストリーミング:renderToPipeableStreamの仕組み」で何を学びますか?

すべての非同期データが解決する前にrenderToPipeableStreamがHTMLチャンクを段階的にフラッシュする仕組みを理解します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「React 18のストリーミング:renderToPipeableStreamの仕組み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. React 18のストリーミング:renderToPipeableStreamの仕組み
  2. Suspense境界とストリーミングの優先度
  3. 選択的ハイドレーションによるプログレッシブハイドレーション
  4. ストリーミングの効果を測定する:FCP、TTI、LCP
← React Academyに戻る