仕組みから学ぶ Web
発展読了目安 16 分#SSR#SSG#CSR#React#サーバーコンポーネント#ハイドレーション

描画をどこでするか — HTML を作る時と場所を、データごとに選ぶ

初回の表示が遅いので、全ページをサーバーで描画するようにした。セールの日、1 日 1 回しか変わらない商品説明を、アクセスのたびに描き直してサーバーが落ちた。方式はアプリ単位ではなく、データの鮮度と、誰のものかで決まる。

この記事の進み方

What — HTML を、いつ・どこで作るか

ブラウザに表示される HTML は、誰かがどこかで組み立てています。違いはいつ作るかとどこで作るかです。

Compare4 つの作り方

公開の前に HTML を作っておき、CDN からそのまま配る。

ビルド時: データ → HTML(全ページ)
アクセス時: CDN → HTML をそのまま返す

サーバーは何もしない
初回の表示
最も速い
データの鮮度
ビルドした時点
サーバーの負荷
ほぼ無い
人ごとの内容
出せない
作る手間
—
  • –アクセスが何倍に増えても、CDN が返すだけなのでサーバーは落ちない。
  • –変わったら作り直す必要がある。ページ数が多いと、作り直しに時間がかかる。

どれが優れているかではなく、何を払って何を得るかが違う。

決めるのはデータの性質

どの方式にするかは、アプリ全体ではなく、ページの中のデータごとに決まります。見るのは 2 つです。

  • どのくらいの速さで変わるか(年に数回・1 日 1 回・秒単位)
  • 誰のものか(全員に同じ・人ごとに違う)
データの例変わる速さ誰のもの向く作り方
商品名・説明・画像1 日 1 回全員に同じSSG、またはキャッシュつきの SSR
在庫の数・価格秒〜分全員に同じ短いキャッシュ、または後から描く
カート・おすすめ操作のたび人ごとブラウザで後から描く
管理画面の表操作のたび人ごとCSR

冒頭のサイトは、1 行目と 2 行目と 3 行目が 1 つのページに混ざっていました。それを全部 1 行目の作り方(CSR)で作り、次に全部 2 行目の作り方(SSR)で作り直したのが失敗です。

確認 — ここまで読めたか

ニュースサイトの記事ページに、記事本文・「いま読まれている記事」の一覧・ログインした人のブックマーク状態があります。ブックマーク状態の描き方として適しているのはどれですか?

まず選ぶ(解答例は a〜d の記号で説明します)

ハイドレーション:表示されても、まだ押せない

SSR や SSG で作った HTML は、表示はすぐされますが、まだ動きません。ボタンを押せるようになるのは、ブラウザが JavaScript を読み込み、HTML の各部分に処理を結び付けたあとです。この結び付けをハイドレーションと呼びます。

  • 表示が速くなっても、JavaScript が大きいと押せるまでが遅い
  • その間に押された操作は、反応しないか、遅れて反応する(Core Web Vitals の INP が悪くなる)

React のサーバーコンポーネントは、ここに対する答えの 1 つです。動きの無い部分はサーバーで HTML にしたまま、JavaScript をブラウザに送らない。押せる部品だけが JavaScript を持ちます。

Why — なぜ「全部同じ作り方」になるのか

フレームワークの既定に、アプリごと乗る

フレームワークを選ぶと、既定の作り方が付いてきます。SPA のテンプレートなら全部 CSR、サーバー描画のフレームワークなら全部 SSR。既定のまま全ページを作ると、データの性質の違いが見えなくなります。

冒頭のサイトは、CSR の既定で作り、問題が出たので SSR の既定にアプリごと乗り換えました。問題の単位(データ)と、直した単位(アプリ)がずれていました。

共有と検索は、JavaScript を待ってくれない

CSR で作ると、HTML には中身がありません。

  • X や Slack の共有カードを作る仕組みは、多くの場合 JavaScript を実行せず、HTML の <meta> だけを読む。中身の無い HTML からは、カードが作れない
  • 検索エンジンは JavaScript を実行できるものもあるが、実行は後回しにされやすく、取りこぼしもある

共有や検索から人が来るページは、少なくとも題名・説明・画像は HTML に入れて返す必要があります。ログインしないと見られない画面は、この制約を受けません。

サーバーで描くことは、費用を払うこと

SSG と CDN の組み合わせは、アクセスが 100 倍になってもサーバーの仕事は増えません。SSR は、アクセスの数だけ描画の仕事が増えます。セールや、SNS で話題になった瞬間のように、アクセスが急に増える場面で差が出ます。

SSR を選ぶなら、描いた結果をどこかでキャッシュできないかを先に考えます。1 日 1 回しか変わらないページを毎回描く理由はありません。

確認 — ここまで読めたか

CSR で作った商品ページを X で共有しても、カードに商品名と画像が出ません。原因として最も近いのはどれですか?

まず選ぶ(解答例は a〜d の記号で説明します)

演習 — まず自分で判断する

解説を読む前に、まず自分で判断してみてください。ここで一度詰まっておくと、 次の節の判断軸が「なるほど」ではなく「そう来たか」に変わります。

演習 — 設計判断を問う

求人サイトの 3 種類のページを、どう描画しますか?

与えられた条件
  • 求人の詳細ページが 4 万件。内容は企業が 1 日に数回更新する。検索エンジンと X からの流入が主
  • 検索結果ページ。職種・地域・年収などの条件の組み合わせは数えきれない
  • マイページ。応募の状況と、保存した求人の一覧。ログインが必要
  • 今は全ページを SSR で描いていて、サーバーの費用が月に 40 万円かかっている
この軸で考える
  • · 各ページのデータは、どのくらいの速さで変わり、誰のものか
  • · 検索や共有から来る人に、何が HTML に入っている必要があるか
  • · アクセスが増えたとき、サーバーの仕事が増えるのはどのページか
まず選ぶ(解答例は a〜d の記号で説明します)

演習 — 説明できるか

「表示が速くなるなら、全ページを SSR にすればいい」と言うプロダクトマネージャーに、それだけでは足りない理由を説明してください

与えられた条件
  • 相手は、初回の表示が遅いという利用者の声を受けて提案している
  • サイトには、商品ページとマイページと管理画面がある
  • 相手が判断できるよう、費用の面も含めて話したい

読み終わりましたか?

読了にすると、これを前提とする記事がロードマップで開放されます。

この記事を前提にしている記事