Next.js のレンダリング方式まとめ|SSG・ISR・SSR・CSR の違いと使い分け

SSG / ISR / SSR の違いとは?どんな時に使うの?

4/21/2025

📝Next.jsのレンダリング(生成)パターン

Next.jsの記事生成のパターンをまとめ。

パターン

説明

SSG(Static Site Generation)

完全な静的生成。HTMLは一度だけビルド時に生成。変更は再ビルドで反映。

SSR(Server Side Rendering)

毎回リクエスト時にHTMLを生成。getServerSideProps を使用。

ISR(Incremental Static Regeneration)

revalidate オプションを使うことで、一定時間ごとに静的HTMLを再生成可能。

CSR(Client Side Rendering)

ページはJSでクライアント側で描画され、HTMLは最小限。

レンダリング方式(SSG、SSR、ISR、CSR)のメリット・デメリット

Next.jsのレンダリング方式にはそれぞれメリットデメリットがある。

パターン

メリット

デメリット

SSG(Static Site Generation)

・高速:ビルド時に生成されたHTMLをそのまま返すので表示が速い
・SEOに強い(完全なHTML)
・CDNキャッシュが効きやすい

・頻繁に更新されるページには不向き
・データが古くなりやすい(再ビルドが必要)
・ページ数が多いとビルド時間が長くなる

SSR(Server Side Rendering)

・毎回最新のデータでレンダリング可能
・SEOにも強い(HTMLを返す)
・ユーザーごとの内容に対応しやすい(認証など)

・表示速度が遅くなることがある(サーバー負荷)
・キャッシュが効きにくい
・サーバーコスト・インフラ管理が増える

ISR(Incremental Static Regeneration)

・SSGの速度+データの自動更新が可能
・表示速度と鮮度のバランスが良い
・CDN対応も可能でスケーラブル

・バグったときに「古いページがキャッシュされたまま」になるリスク
・ユーザーによっては古い内容を一時的に見る可能性がある

CSR(Client Side Rendering)

・動的コンテンツに強い(SPAに向いている)
・APIベースで柔軟に構成可能
・ページ間の遷移が速くなる

・初回表示が遅い(JSが読み込まれるまで表示されない)
・SEOが弱くなる(クローラーはJSを完全に理解できない場合がある)
・JSエラーで真っ白になるリスク

SSG、SSR、ISR、CSRそれぞれの基本挙動

📝 SSG(Static Site Generation)の基本挙動

SSG化すると、ページのビルド時にサーバーサイドで静的HTMLが生成される。
リロード時も、CDNなどを介して生成済みのHTMLがそのまま返ってくる。

タイミング

起こること

ビルド時

getStaticProps+(getStaticPaths)が実行され、静的HTMLが生成

アクセス時

事前に生成済されたHTMLが即座に返される(CDNキャッシュ経由) or 条件により再生成

更新時

コードやデータを変更 → 再ビルドが必要(再デプロイ)

export const getStaticProps = async () => {
  const data = await fetchData();// 別コンポーネントでデータを取得
  return {
    props: { data }, // ページコンポーネントに渡すprops
  };
};

📝ISR(Incremental Static Regeneration)基本挙動

SSGの派生。
Next.jsが提供する「静的生成(SSG)+ 動的な再生成」を組み合わせた仕組み。

ページを事前にビルドしておくけど、必要に応じてあとから自動で再生成できる
getStaticPropsrevalidate をつけることで実現。

revalidate時間を設定することで、アクセス時にバックグラウンドで静的HTMLを自動再生成できる。

タイミング

起こること

ビルド時

getStaticProps が実行され、初回の静的HTMLを生成

アクセス時

生成済みHTMLが返る(再生成されていない場合)

revalidate経過後のアクセス

表示はキャッシュ → 裏でgetStaticPropsが実行され、次回アクセスで新HTMLが配信される

export const getStaticProps = async () => {
  const data = await fetchData();
  return {
    props: { data },
    revalidate: 60, // 60秒ごとに再生成(次のアクセス時に)
  };
};

📝SSR(Server-side Rendering)の基本挙動

毎回リクエストがあるたびに、サーバー側でHTMLを生成して返す。getServerSideProps を使用。
リアルタイム性が必要なページに適している。

タイミング

起こること

アクセス時(毎回)

getServerSideProps が実行され、サーバーでHTMLを生成して返す

キャッシュ

基本なし(毎回サーバーに負荷)

ユーザー別データ

表示内容をユーザーごとに出し分け可能(ログインなど)

export const getServerSideProps = async () => {
  const res = await fetch("https://api.example.com/blogs");
  const data = await res.json();

  return {
    props: { data },
  };
};

export default function Blog({ data }) {
  return <div>{data.title}</div>;
}

📝CSR(Client-side Rendering)の基本挙動

クライアントサイド(ブラウザ)でJavaScriptがデータを取得して、DOMを描画する方式。
Next.js では useEffect でAPIから取得するなど。

タイミング

起こること

初回アクセス時

HTMLはほぼ空(Loading状態)、JSが読み込まれた後に表示

データ取得

ブラウザ側でAPIなどからフェッチして描画

SEO

JS実行前は中身がないため、SEOにやや弱い(工夫が必要)

import { useEffect, useState } from "react";

export default function Blog() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch("https://api.example.com/blogs")
      .then((res) => res.json())
      .then((json) => setData(json));
  }, []);

  if (!data) return <div>Loading...</div>;

  return <div>{data.title}</div>;
}

⭐️まとめ

それぞれのレンダリング方法に、カスタマイズの柔軟さやメリットデメリットがある。
そのページの目的に合わせたレンダリング方法を選ぶと良い。