SSRのストリーミングレンダリングは何を速くするのか

「SSRを速くした」のではなく「待たせ方を変えた」

SSR(Server Side Rendering)の進化として、近年よく登場するのが「ストリーミングレンダリング」です。React 18以降やNext.jsで特に強調される機能ですが、ここで誤解されがちなのが「HTML生成が高速化された」という理解です。

実際には違います。ストリーミングレンダリングはサーバの処理を高速化しているわけではありません。ユーザーが待っている時間の見え方を変えています
具体的には「ページが完成するまで待たせる」から「できた部分から見せる」へ変えています。

従来のSSRの問題点

従来のSSRは次の手順でした。

1. データ取得(DB/API)
2. テンプレート描画
3. HTML完成
4. ブラウザへ送信
5. 画面表示

ここで重要なのは、HTMLが完成するまで1バイトも送られない点です。

たとえばページ内に次の3つのデータがあるとします。

  • ヘッダー情報(50ms)
  • 記事一覧(300ms)
  • おすすめ商品(900ms)

従来SSRでは、最後の「900ms」が終わるまでブラウザは何も受け取れません。ユーザーから見ると「白い画面が続く」状態になります。

この待ち時間はTTFB(Time To First Byte)として計測されます。

ストリーミングレンダリングの仕組み

ストリーミングレンダリングはHTMLを分割して送ります。

1. ヘッダー完成 → 即送信
2. 記事一覧完成 → 送信
3. おすすめ商品完成 → 最後に送信

つまりHTMLを1つのファイルとして扱わず、「データの流れ(stream)」として扱います。

HTTP/1.1 200 OK
Transfer-Encoding: chunked

chunked転送では、サーバはHTMLを完成させる必要がありません。生成した瞬間に送れます。

ここで初めて「SSRの表示が速い」と感じる体験が生まれます。

何が高速化されているのか

ストリーミングレンダリングが改善している指標は次の通りです。

指標 改善内容
TTFB 最初のHTMLが早く届く
FCP 最初の描画が早く始まる
LCP 主要コンテンツの体感が改善

逆に改善していないものもあります。

  • DB応答時間
  • APIレスポンス時間
  • サーバCPU時間

つまり処理時間は同じでも表示開始が早くなるのです。

Suspenseとプレースホルダの役割

ReactのSuspenseはストリーミングとセットで使われます。遅いデータを待たず、仮のUIを先に出します。

例:

  • ヘッダー → すぐ表示
  • 記事 → 表示
  • おすすめ商品 → 「読み込み中…」

ユーザーは「表示されている」と認識します。実際には裏で処理が続いています。

ここで重要なのは、ユーザーは処理完了を待っていないという点です。人間は「何も表示されない時間」に敏感で、「変化がある状態」には寛容です。

なぜSPAより速く感じるのか

SPAの初期表示は次の順序になります。

1. JSダウンロード
2. JS実行
3. API通信
4. 描画

最初の描画はJSとAPIの両方を待ちます。

一方ストリーミングSSRでは、

1. HTML受信
2. 即描画開始
3. JSとデータは後追い

になります。ここが本質的な差です。
描画が通信を待つか、通信が描画の後に続くかの違いです。

注意点:万能ではない

ストリーミングレンダリングにもリスクがあります。

  • キャッシュが難しくなる
  • HTML構造が複雑化
  • デバッグが困難

特にCDNキャッシュは「完成HTML」を前提とするため、ストリーム出力は扱いづらくなります。また、検索エンジンのクローラが必ずしもストリームを完全解釈するとは限りません。

さらに重要な点として、JavaScriptのハイドレーションが遅いと体感は逆に悪化します。表示はされているのに操作できない状態(インタラクション遅延)が発生します。

SSRの進化の方向性

従来のSSR
「完成したページを送る」

ストリーミングSSR
「生成中のページを送る」

ここでSSRの役割が変わっています。サーバはHTMLを配布する装置ではなく、ブラウザの描画を先導する存在になっています。

ページ表示速度の改善とは、CPU処理を短縮することではありません。ユーザーが何を待っていると感じるかを制御することです。

ストリーミングレンダリングはパフォーマンス最適化というより、UX設計に近い技術です。Webの高速化は「速く計算する」から「先に見せる」へ移行しています。