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ができるようになっているんだ。
仕組みの正体:ビルド時の「疑似実行」
-
スキャン: ツールがReact Routerの定義を見て、「
/aboutや/contactというルートがあるな」と把握する。 -
レンダリング: Node.js上でReactの
renderToStringという機能を使って、各ルートをHTML文字列に変換する。 -
書き出し: 変換された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に命を吹き込む作業」を水に例えてハイドレーション(給水)と呼ぶんだ。面白いネーミングだよね!