2021/05/19
はじめに
Next.js でブログを SSG して,Github Pages にデプロイしようと思いました.
初めての React 系フレームワークだった(Gatsby も併せて初めて触りました)ので,手間取った点もあります.
多くの人が詰まりそうな点があったので公開します.
TL;DR
next export
する!
本題
何に困ったのか?
漠然と,next build
をすれば SSG されて,.next
内に静的サイトが生成されるのかなーと思い込んでいた点.
そして,特に考えもせずに,ステージングのようなイメージで Firebase Hosting でブログを確認しようと考え,デプロイ用ディレクトリの設定をした後,firebase deploy
をした.
しかし,URL にアクセスすると,自分の作成したはずのページではなく,firebase init
が生成したindex.html
が表示された.
何が原因だったのか?
Next.jsのデプロイメントのページを確認してみた.
next build
builds the production application in the.next
folder. After building,next start
starts a Node.js server that supports hybrid pages, serving both statically generated and server-side rendered pages.
ここでいう production application というのは,Next.js で SSR するためということらしく,どうやら SSG するには他のアプローチが必要とのこと.
つまり,Github Pages や Firebase Hosting のような静的サイトをホスティングするサービスを使う場合は,next build
だけでは不十分だということらしい.
じゃあどう解決するのか?
結論から言うと,next export
をすると良い.
next export
は,
まずは,静的 HTML エクスポートの生成については,先程のデプロイメントのページの最下部からジャンプすることができる.
該当ページによると,next export
コマンドを用いると,out
ディレクトリに静的 HTML が生成されるとのこと.
また,SSG として Next.js を用いたい場合は,npm run build
を以下のように設定することが推奨されている.
"scripts": {
"build": "next build && next export"
}
ここまでで,npm run build
によってout
ディレクトリにホスティングサービスにデプロイするためのファイル群が生成される.
そのまま,out
をデプロイする設定をしてしまっても問題はない.
さらに便利に使いたい
out
をデプロイしてもよいのだが,正直,デプロイするディレクトリの名前としては分かりづらい.
そこで,静的 HTML の生成ディレクトリ名をbuild
にしようと思う.
next export
コマンドのヘルプを見ると・・・
$ next export --help
Description
Exports the application for production deployment
Usage
$ next export [options] <dir>
<dir> represents the directory of the Next.js application.
If no directory is provided, the current directory will be used.
Options
-h - list this help
-o - set the output dir (defaults to 'out')
-s - do not print any messages to console
ふむふむ,-o
オプションで指定できるそうだ.
以下のように設定すると良い.
"scripts": {
"build": "next build && next export -o build"
}
おわりに
以上です.
今回は,build/
に静的 HTML を保存することにしましたが,
今後 Next.js の理解が深まり,build/
というディレクトリ名を他の用途で使う必要があれば,
out/
を静的 HTML を保存する先に戻そうかと考えています.
参考
-
Next.jsのデプロイメントのページ