自作ブログを作っています。
技術スタック
- TypeScript
- React
- Next.js
- Styled Components
- GitHub Pages
今回はGitHub Pagesで公開します。
設定
GItHub上での設定が必要です。
Settings > Pagesが設定ページです。
今回は Source = Deploy from a branch
という設定で、gh-pages
というブランチをpushしたときに、/docs
以下をデプロイするよう設定しました。
静的ファイル化
通常の開発時には開発サーバーを立ち上げ、その機能によって画面表示がされます。
一方本番デプロイのためには静的ファイルとしてまとめる必要があります。
今回利用しているNext.jsでは静的ファイル化の機能を提供しているため、これを呼び出すだけで済みます。
まずはnext.config.js
package.json にコマンドを追加します。
{ ... "scripts": { ... "export:gh-pages": "npm run clear:gh-pages && BASE_PATH='blog' npm run export && touch out/.nojekyll && cp -r out ../docs", "clear:gh-pages": "rm -rf ./out ../docs", ... } ... }
clear:gh-pages
は、主にローカル環境での動作確認時に、生成されるファイルを削除するコマンドです。
export:gh-pages
は、静的ファイル生成のためのコマンドです。
npm run export
というのがNext.jsが提供しているコマンドです。
touch out/.nojekyll
の記述によって、.nojekyll
というファイルを生成します。
こちらがないと、デプロイ時に 生成ファイルの内_next
に対してNot Foundエラーが発生してしまいます。
この問題については、下記のページの説明がわかりやすかったです。
GitHub Pagesで普通の静的ホスティングをしたいときは .nojekyll ファイルを置く #GitHub - Qiita
最後にcp -r out ../docs
の箇所にて、docs ディレクトリに静的ファイルを移動します。
これは、
BASE_PATH='blog'
の記述については、次の章で説明します。
path問題の解決
GitHub Pagesで公開した場合、デフォルトのURLは下記のようになります。
https://[user-name].github.io/[repository-name]
ここでの問題として、ローカル環境の場合と違ってGitHub Pages上では/[repository-name]
のパスが含まれることへの対応が必要となります。
next.config.js
への記述によって、base pathを指定することができます。
const basePath = process.env.BASE_PATH ? '/' + process.env.BASE_PATH : '' const nextConfig = { basePath, } module.exports = nextConfig
process.env.BASE_PATH
の箇所は環境変数で、これによって、ローカル環境では未指定としたり、GitHub Pages上では[repository-name]
を指定することができます。
前章の静的ファイル化のコマンドに含めた BASE_PATH='blog'
は、この[repository-name] = blog
を指定していました。
デプロイ
先の設定に則り、gh-pages
というブランチにpush することで公開ができます。
デプロイに成功しました。
ただ画像が表示されない問題があります。
こちらは次回解決していきます。
あとがき
あけましておめでとうございます。
年末は夫婦で体調を崩して大変でしたが、なんとか回復しました。