Prompt

React Routerがあれば、Next.jsなどのサーバーがなくてもSSGができるの?
それはいったいなぜ?

やっほー!その疑問、Reactのエコシステムを深く理解しようとする時に誰もが通る、とっても重要な分岐点だね!

結論から言うと、**「React Router単体ではSSG(静的サイト生成)はできないけれど、React Routerを使ったプロジェクトをSSGとして書き出すツールを組み合わせれば可能」**ということになるよ。

「なぜNext.jsのようなサーバー(ランタイム)がなくてもSSGができるのか」、その魔法の正体を情報工学的に解き明かしてみよう!


1. そもそもSSGの本質とは?

SSGの本質は、**「ブラウザがJavaScriptを実行して画面を作る前に、あらかじめ誰かが実行してHTMLファイルを作っておくこと」**なんだ。

  • 通常のReact: ブラウザに真っ白なHTMLが届き、JavaScriptが動いて初めて中身ができる(Client Side Rendering - CSR)。

  • SSG: ビルド時(君のPCやGitHub Actionsで動かしている時)に、仮想的なブラウザ環境でReactを動かし、その結果を .html ファイルとして保存する。


2. なぜNext.jsなしでもできるの?(Viteなどの役割)

最近のReact Router(特にv7以降)や、Viteを中心としたツールチェーンを使えば、Next.jsのような巨大なフレームワークがなくてもSSGができるようになっているんだ。

仕組みの正体:ビルド時の「疑似実行」

  1. スキャン: ツールがReact Routerの定義を見て、「/about/contact というルートがあるな」と把握する。

  2. レンダリング: Node.js上でReactの renderToString という機能を使って、各ルートをHTML文字列に変換する。

  3. 書き出し: 変換されたHTMLを about.html などのファイルとしてディスクに保存する。

これが済んでしまえば、Webサーバー(NginxやS3、GitHub Pagesなど)は、ただの「ファイルを配る機械」として動くだけでいいんだ。Next.jsのような複雑な「サーバーサイドの処理」は、閲覧時にはもう必要ないんだよ!


3. React Router v7 (旧Remix) の進化

実は今、React Router自体が「ただのライブラリ」から「フレームワーク」へと進化したんだ。

  • React Router v7 は、かつての Remix というフレームワークを吸収したんだ。

  • これにより、設定ファイルで ssr: false かつ prerender: true(あるいはSSGモード)を指定するだけで、React Router自身が「各ページをビルド時にHTML化する機能」を持つようになったんだよ。


💡 見落とされがちな落とし穴:動的なデータの扱い

SSGでReact Routerを使うとき、一番気をつけなきゃいけないのが 「いつデータが決まるか」 だよ。

  • ビルド時に決まるデータ: 外部APIからブログ記事を取ってくるなどは、ビルド時にHTMLに埋め込めるからSSGでOK。

  • 閲覧時に決まるデータ: ログインユーザーの名前や、現在の株価などは、SSGで作ったHTMLがブラウザに届いた後、**「Hydration(ハイドレーション)」**という工程でReactが息を吹き返し、改めてAPIを叩く必要があるんだ。


💡 豆知識:Hydration (ハイドレーション)

SSGで生成されたHTMLは、最初はただの「静かな絵」だよ。ブラウザがJavaScriptを読み込んだ瞬間、ReactがそのHTMLを「スキャン」して、イベントリスナ(クリックして動く機能など)を紐付け直す。この「静かなHTMLに命を吹き込む作業」を水に例えてハイドレーション(給水)と呼ぶんだ。面白いネーミングだよね!