レンダリング手法
🖥️ SSR(Server‑Side Rendering/サーバーサイドレンダリング)
- 仕組み
- ユーザーがページ URL にアクセス
- サーバーが React コンポーネントを動的にレンダリングして HTML を生成
- 生成した HTML をブラウザに返却
- クライアントで React が Hydration(イベント紐付け)
- メリット
- 初回表示が速い(HTML がすでに組み立て済み)
- SEO に強い
- デメリット
- リクエストごとにレンダリングコストがかかる
- トラフィック増加時はサーバー負荷が上がりやすい
📄 SSG(Static Site Generation/静的サイト生成)
- 仕組み
- ビルド時(
next build
)に全ページの HTML を事前生成 - CDN やサーバーに配置
- ユーザーは静的ファイルを受け取るだけ
- ビルド時(
- メリット
- 配信コストが極めて低い(CDN 配信)
- リクエストごとのレンダリング不要で超高速
- デメリット
- ビルド時に生成されるため、リアルタイム性のあるデータには不向き
- ページ数が多いとビルド時間が長くなる
🔄 ISR(Incremental Static Regeneration/インクリメンタル静的再生成)
- 仕組み
- SSG と同じく静的ファイルを生成するが、一定時間ごと または オンデマンド で再生成可能
revalidate
オプションを設定するだけで自動的に差分更新
- メリット
- SSG の高速性を維持しつつ、コンテンツを最新化できる
- 大規模サイトでもビルド時間を抑えつつ頻繁な更新を実現
- デメリット
- 更新タイミングの誤差(最大
revalidate
秒間は古いまま) - 設定ミスで意図しないタイミングで再生成が走る可能性
- 更新タイミングの誤差(最大
🌐 CSR(Client‑Side Rendering/クライアントサイドレンダリング)
- 仕組み
- ブラウザに最小限の HTML と JavaScript バンドルを返却
- JavaScript 実行後、React がマウントされて画面を動的に描画
- メリット
- ユーザー操作に対して高速なインタラクション
- リアルタイム性の高いデータ取得・更新に最適
- デメリット
- 初回表示までに JavaScript ダウンロード・実行待ちが発生しやすい
- SEO は基本的に不向き(プリレンダリングが別途必要)
🔀 ハイブリッド/その他のパターン
パターン | 特徴 |
---|---|
SSG + CSR | 静的生成後、必要な箇所だけ CSR で動的にデータをフェッチ |
SSR + CSR | 初回は SSR、ユーザー操作以降は CSR で更新 |
プレビュー モード | CMS と連携し、ビルドせずにリアルタイムでプレビュー用のページを SSR で表示 |
On‑Demand ISR | API 経由で任意のタイミングに静的ページを再生成 |
選び方のポイント
- SEO & 初回表示重視 → SSR or SSG/ISR
- 大量ページ+高パフォーマンス → SSG or ISR
- リアルタイムデータ or ユーザー操作中の更新 → CSR or SSR + CSR
- 部分的に最新化したい静的ページ → ISR
マウントとは
マウント(Mount) は、React のコンポーネントが 初めてブラウザの DOM 上に表示される 一連の流れを指します。具体的には以下のステップです。
- 📄 仮想 DOM の生成
- React コンポーネントの JSX をもとに、メモリ上に「仮想 DOM(Virtual DOM)」を作成します。
- 🌐 実際の DOM への反映
- React が仮想 DOM を比較・検証し(差分検出)、必要な箇所だけをブラウザの実際の DOM に書き込みます。
- 🔗 ライフサイクルメソッド(フック)の実行
- コンポーネントが DOM に置かれた直後に、
componentDidMount
(クラスコンポーネント)やuseEffect(..., [])
(関数コンポーネント)といった「マウント時の処理」が一度だけ呼び出されます。
- コンポーネントが DOM に置かれた直後に、
- 🎯 インタラクティブな準備完了
- イベントハンドラ(
onClick
など)や state 更新機能が DOM 要素に結びつき、ユーザー操作を受け付けられる状態になります。
- イベントハンドラ(
なぜ「マウント」を意識するか?
- Hydration の制御
- SSR 後にクライアント側で初めてマウントが完了するまで、JavaScript の処理やイベントは動かない。
- 副作用の発火タイミング
- データ取得やサブスクライブなど、ブラウザ環境でしか行えない処理をマウント後にだけ実行したいときに使う。
まとめ
- マウント前 → 仮想 DOM はあるが、まだ画面に要素が置かれていない状態。
- マウント中 → React が実際の DOM に書き込んでいる最中。
- マウント後 → DOM 上に要素が存在し、イベントハンドラなどが有効になった状態。
💧 Hydration(ハイドレーション)とは
サーバーサイドレンダリング(SSR)で返された静的な HTML に、クライアント側の React が「リアクティブな振る舞い(イベントハンドラや state の管理)」をあとから “水を含ませる” ように注入する処理のこと。
❓ なぜ必要か?
- 🚀 初期表示の高速化 & SEO
- Next.js はサーバー上で先に HTML を生成し、ブラウザに送信することで、ページロードを速くし、検索エンジンにも評価されやすくする。
- 🔄 SPA 的な動作を実現
- 静的ページとして受け取った HTML を、JavaScript 実行後に React が「この HTML は自分のものだ!」と認識し、 イベントハンドラや state の更新機能をひも付けて、動的な操作を可能にする。
🔄 Hydration の流れイメージ
-
🌐 ブラウザが
/order
ページを開く -
🏗️ Next.js サーバーが HTML を組み立てて送信
-
📄 ブラウザが静的なマークアップを描画
この段階ではまだ React のイベントは動かない
-
⚡ JavaScript が読み込まれ、React が Hydrate 開始
「この HTML は自分のものだ!」と再認識
-
🎁 React が各要素に onClick や useState をひも付け
ページがインタラクティブに動作するようになる
🔑 ポイントまとめ
- ⏳ Hydration 前はイベントが動かない
- React のイベントハンドラが紐付くまでは、ボタンを押しても何も起きないことがある
- 🎉 Hydration 後にインタラクティブに
- Hydration が完了すると、onClick やフォーム入力などが正しく機能する
- 🌉 SSR と CSR の橋渡し
- サーバーでの高速表示(SSR)と、その後の動的なやりとり(CSR)をつなぐ重要なプロセス