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をそのまま返すので表示が速い | ・頻繁に更新されるページには不向き |
SSR(Server Side Rendering) | ・毎回最新のデータでレンダリング可能 | ・表示速度が遅くなることがある(サーバー負荷) |
ISR(Incremental Static Regeneration) | ・SSGの速度+データの自動更新が可能 | ・バグったときに「古いページがキャッシュされたまま」になるリスク |
CSR(Client Side Rendering) | ・動的コンテンツに強い(SPAに向いている) | ・初回表示が遅い(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)+ 動的な再生成」を組み合わせた仕組み。
ページを事前にビルドしておくけど、必要に応じてあとから自動で再生成できる
→ getStaticProps に revalidate をつけることで実現。
revalidate時間を設定することで、アクセス時にバックグラウンドで静的HTMLを自動再生成できる。
タイミング | 起こること |
|---|---|
ビルド時 |
|
アクセス時 | 生成済みHTMLが返る(再生成されていない場合) |
revalidate経過後のアクセス | 表示はキャッシュ → 裏で |
export const getStaticProps = async () => {
const data = await fetchData();
return {
props: { data },
revalidate: 60, // 60秒ごとに再生成(次のアクセス時に)
};
};📝SSR(Server-side Rendering)の基本挙動
毎回リクエストがあるたびに、サーバー側でHTMLを生成して返す。getServerSideProps を使用。
リアルタイム性が必要なページに適している。
タイミング | 起こること |
|---|---|
アクセス時(毎回) |
|
キャッシュ | 基本なし(毎回サーバーに負荷) |
ユーザー別データ | 表示内容をユーザーごとに出し分け可能(ログインなど) |
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>;
}⭐️まとめ
それぞれのレンダリング方法に、カスタマイズの柔軟さやメリットデメリットがある。
そのページの目的に合わせたレンダリング方法を選ぶと良い。