描画をどこでするか — HTML を作る時と場所を、データごとに選ぶ
初回の表示が遅いので、全ページをサーバーで描画するようにした。セールの日、1 日 1 回しか変わらない商品説明を、アクセスのたびに描き直してサーバーが落ちた。方式はアプリ単位ではなく、データの鮮度と、誰のものかで決まる。
この記事の進み方
What — HTML を、いつ・どこで作るか
ブラウザに表示される HTML は、誰かがどこかで組み立てています。違いはいつ作るかとどこで作るかです。
公開の前に HTML を作っておき、CDN からそのまま配る。
ビルド時: データ → HTML(全ページ) アクセス時: CDN → HTML をそのまま返す サーバーは何もしない
- 初回の表示
- 最も速い
- データの鮮度
- ビルドした時点
- サーバーの負荷
- ほぼ無い
- 人ごとの内容
- 出せない
- 作る手間
- —
- –アクセスが何倍に増えても、CDN が返すだけなのでサーバーは落ちない。
- –変わったら作り直す必要がある。ページ数が多いと、作り直しに時間がかかる。
どれが優れているかではなく、何を払って何を得るかが違う。
決めるのはデータの性質
どの方式にするかは、アプリ全体ではなく、ページの中のデータごとに決まります。見るのは 2 つです。
- どのくらいの速さで変わるか(年に数回・1 日 1 回・秒単位)
- 誰のものか(全員に同じ・人ごとに違う)
| データの例 | 変わる速さ | 誰のもの | 向く作り方 |
|---|---|---|---|
| 商品名・説明・画像 | 1 日 1 回 | 全員に同じ | SSG、またはキャッシュつきの SSR |
| 在庫の数・価格 | 秒〜分 | 全員に同じ | 短いキャッシュ、または後から描く |
| カート・おすすめ | 操作のたび | 人ごと | ブラウザで後から描く |
| 管理画面の表 | 操作のたび | 人ごと | CSR |
冒頭のサイトは、1 行目と 2 行目と 3 行目が 1 つのページに混ざっていました。それを全部 1 行目の作り方(CSR)で作り、次に全部 2 行目の作り方(SSR)で作り直したのが失敗です。
ニュースサイトの記事ページに、記事本文・「いま読まれている記事」の一覧・ログインした人のブックマーク状態があります。ブックマーク状態の描き方として適しているのはどれですか?
ハイドレーション:表示されても、まだ押せない
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 回しか変わらないページを毎回描く理由はありません。
演習 — まず自分で判断する
解説を読む前に、まず自分で判断してみてください。ここで一度詰まっておくと、 次の節の判断軸が「なるほど」ではなく「そう来たか」に変わります。
求人サイトの 3 種類のページを、どう描画しますか?
- 求人の詳細ページが 4 万件。内容は企業が 1 日に数回更新する。検索エンジンと X からの流入が主
- 検索結果ページ。職種・地域・年収などの条件の組み合わせは数えきれない
- マイページ。応募の状況と、保存した求人の一覧。ログインが必要
- 今は全ページを SSR で描いていて、サーバーの費用が月に 40 万円かかっている
- · 各ページのデータは、どのくらいの速さで変わり、誰のものか
- · 検索や共有から来る人に、何が HTML に入っている必要があるか
- · アクセスが増えたとき、サーバーの仕事が増えるのはどのページか
「表示が速くなるなら、全ページを SSR にすればいい」と言うプロダクトマネージャーに、それだけでは足りない理由を説明してください
- 相手は、初回の表示が遅いという利用者の声を受けて提案している
- サイトには、商品ページとマイページと管理画面がある
- 相手が判断できるよう、費用の面も含めて話したい
読み終わりましたか?
読了にすると、これを前提とする記事がロードマップで開放されます。