【比較】SSR・CSR・SSG・ISRの違い¶
概要¶
SSR・CSR・SSG・ISR は、Web ページの HTML を「どこで」「いつ」生成するかという戦略(レンダリング戦略)の違いです。同じ React/Vue アプリでも、最終的にブラウザへ届く HTML の作られ方が変わると、初回表示速度(TTFB・FCP)・SEO・インタラクティブになるまでの時間が大きく変わります。
整理すると、CSR はブラウザで実行時に、SSR はサーバーでリクエストごとに、SSG はビルド時に一度だけ、HTML を生成します。ISR は SSG を土台にしつつ、デプロイ後も時間経過や明示的なトリガーでページを再生成する仕組みで、これは Web 標準の用語ではなく Next.js が導入したフレームワーク固有の概念です(他フレームワークにも類似機能はありますが、ISR という呼称は Next.js のもの)。混同しやすいのは、これらが排他的な選択肢ではなく、ページ単位で使い分けたりハイブリッドにできる点です。
例えるなら:料理を「いつ調理するか」¶
- CSR … 注文を受けてから客自身が厨房(ブラウザ)で材料(JS)を受け取り自分で調理する。最初の一皿が出るまで遅いが、その後の操作は手元で速い。
- SSR … 注文ごとに厨房(サーバー)が出来たてを作って出す。常に最新だが、注文が来てから作るので一皿目に少し待つ(TTFB 増)。
- SSG … 開店前(ビルド時)に全メニューを作り置きしておき、注文が来たら即出す。最速だが、作り置きなので内容は固定。
- ISR … 作り置き(SSG)を基本にしつつ、「一定時間ごと」または「指示が来たら」厨房が裏で作り直して差し替える。速さと鮮度を両立。
詳細比較¶
| 比較軸 | CSR(クライアントサイドレンダリング) | SSR(サーバーサイドレンダリング) | SSG(静的サイト生成) | ISR(増分的静的再生成・Next.js 用語) |
|---|---|---|---|---|
| HTML を生成する場所 | ブラウザ | サーバー | ビルド環境 | ビルド環境+デプロイ後のサーバー |
| HTML を生成するタイミング | ページ読み込み後(実行時) | リクエストごと | build 実行時に一度 |
build 時に生成し、その後再生成 |
| 初回 HTML の中身 | ほぼ空(JS が後から描画) | 完成した HTML | 完成した HTML | 完成した HTML(場合により stale) |
| TTFB(最初の1バイトまで) | 速い(中身の薄い静的シェルを返すだけ。シェル配信方法に依存) | リクエストごとの生成分だけ遅くなりうる | 速く安定(生成済み) | 速く安定(基本はキャッシュ配信) |
| SEO・クローラ対応 | 不利になりやすい(初期 HTML が空) | 有利(完成 HTML を返す) | 有利(完成 HTML を返す) | 有利(完成 HTML を返す) |
| データの鮮度 | 実行時取得で常に最新にしやすい | リクエストごとに最新 | ビルド時点で固定 | revalidate 間隔/明示トリガーで更新 |
| ハイドレーション | 必要(最初から JS で構築) | 必要(サーバー HTML に対話性を付与) | 必要(静的 HTML に対話性を付与) | 必要(SSG と同様) |
| 向くケース | 管理画面・ログイン後アプリ | 毎回変わる動的ページ | ブログ・ドキュメント・LP | 多数だが頻繁には変わらないページ |
よくある誤解¶
- 誤解1:「ISR は HTTP やブラウザの標準的なレンダリング方式の一つ」 — 誤りです。SSR/CSR/SSG はレンダリングの一般概念ですが、ISR(Incremental Static Regeneration)は Next.js が提供するフレームワーク機能の名称です。公式ドキュメントも「ISR はサイト全体を再ビルドせずに静的コンテンツを更新できる」機能として定義しています。他フレームワーク(Astro・Nuxt 等)にも類似の再生成機構はありますが、「ISR」という語を一般用語として SSR/CSR と同列に並べると不正確になります。
- 誤解2:「ISR は revalidate 時間が来たらユーザーを待たせて再生成する」 — 誤りです。Next.js の時間ベース revalidation は stale-while-revalidate 型で、期限切れ後の最初のリクエストにもまずキャッシュ済み(古い)ページを即座に返し、裏側で新版をバックグラウンド生成して次回以降に差し替えます。公式ドキュメントも「the next request will still return the cached (now stale) page」「a new version of the page begins generating in the background」と明記しています。
- 誤解3:「SSR にすれば必ず表示が速くなる」 — 一概には言えません。SSR は完成 HTML を返すため FCP や SEO に有利な一方、サーバーがリクエストごとに HTML を生成する分 TTFB が増えうると web.dev も指摘しています。SSG/ISR は生成済みを配るため TTFB が安定して速い、というトレードオフがあります。
- 誤解4:「CSR は SEO に絶対不利」 — 「初期 HTML がほぼ空」なため不利になりやすいのは事実ですが、絶対ではありません。ログイン後の管理画面など、そもそも検索インデックス不要な領域では CSR の不利は問題になりません。問題は「公開ページなのに CSR で初期 HTML が空」というケースであり、用途を踏まえた評価が必要です。
実務での選び分け¶
レンダリング戦略は「アプリ全体で1つ」ではなく、ページ単位で選ぶのが現代の定石です。
- 公開コンテンツで内容がほぼ変わらない(ブログ・ドキュメント・LP) → SSG。最速・最安・SEO 良好。
- 公開コンテンツだが件数が多く、たまに更新される(EC の商品ページ・ニュース記事) → ISR(Next.js)等。SSG の速さを保ちつつ、revalidate 時間や CMS 更新時の on-demand トリガー(
revalidatePath/revalidateTag)で鮮度を担保。 - リクエストごとに内容が変わる/パーソナライズが必要(ダッシュボード初期表示、認証依存ページ) → SSR。完成 HTML を返しつつ常に最新。TTFB 増は許容範囲か検証する。
- 検索インデックス不要で操作中心のアプリ(社内管理画面、SaaS のログイン後画面) → CSR でも十分。初期 HTML が空でも実害が少なく、実装がシンプル。
- 判断軸:①そのページは検索に乗せたいか(SEO) ②データの鮮度要件(ビルド時固定で良いか/毎回最新か/その中間か) ③トラフィックと生成コスト。これらをページごとに当てはめると自然に戦略が決まります。
ひとことまとめ¶
CSR=ブラウザで実行時、SSR=サーバーでリクエストごと、SSG=ビルド時に一度、ISR=SSG+デプロイ後の定期/明示再生成(Next.js 固有用語)。排他選択ではなくページ単位で使い分けるのが実務の基本です。
出典・参考¶
- web.dev「Rendering on the Web」(SSR=サーバーで HTML を生成して返す/CSR=ブラウザで JS が DOM を構築/static rendering はビルド時/hydration の定義、SSR は TTFB が増えうる等のトレードオフ): https://web.dev/rendering-on-the-web/
- Next.js 公式「How to implement Incremental Static Regeneration (ISR)」(ISR はサイト全体を再ビルドせず静的コンテンツを更新する機能。時間ベースは stale-while-revalidate=古いページを返しつつ裏で再生成。on-demand は
revalidatePath/revalidateTag。ISR は Node.js ランタイム必須、Static Export 非対応): https://nextjs.org/docs/app/guides/incremental-static-regeneration - Next.js 公式「revalidatePath」(特定パスのキャッシュをオンデマンドで無効化する API リファレンス): https://nextjs.org/docs/app/api-reference/functions/revalidatePath