GitHub Actions から GitHub Pages へ通すため .github/workflows/deploy.yml にデプロイするためのソースコードを書く。
ここでのポイントは 2 点。
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Transpile
        run: |
          npm install
          npm run build
        env:
          CI: true
          URL_PREFIX: <REPO_NAME>
          GITHUB_PAGES: true
      - name: Export
        run: |
          npm run export
          touch out/.nojekyll
      - name: Deploy
        uses: peaceiris/[email protected]
        env:
          ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          PUBLISH_BRANCH: gh-pages
          PUBLISH_DIR: ./out
Static HTML Export を利用することで Web サーバに Node.js を必要とせず、クライントのみで実行できる静的 HTML にアプリを出力する。
npm run export
Vercel や Netlify を利用する場合にこれをもって完結できる一方 GitHub Pages を利用する場合ではハマる箇所が多々存在するため今回書かせていただいた。
- JavaScript ファイルが 404 になってしまう
 - CSS ファイルなどのリソースを読み込めない
 
JavaScript ファイルが 404 になってしまう
これは GitHub Pages の仕様で _ から始まるディレクトリが見えなくなる事象を回避するため .nojekyll をデプロイ対象のディレクトリ out に配置する。
touch out/.nojekyll
CSS ファイルなどのリソースを読み込めない
https://{アカウント名}.github.io/{リポジトリ名} のように basePath が無い URL で取得しないよう assetPrefix を設定する。
const REPO_NAME = ''
const urlPrefix = process.env.NODE_ENV === 'production' ? '/' + REPO_NAME : ''
const nextConfig = {
  assetPrefix: urlPrefix,
  basePath: urlPrefix,
}
module.exports = nextConfig
favicon や manifest.json を読み込む際も assetPrefix を設定する。
import Head from 'next/head'
const urlPrefix = process.env.NODE_ENV === 'production' ? '/conf2021' : ''
const SEO = () => {
  return (
    <>
      <Head>
        <link rel="icon" href={`${urlPrefix}/favicon.ico`} />
        <link rel="manifest" href={`${urlPrefix}/manifest.json`} />
      </Head>
    </>
  )
}
export default SEO
:::message is-primary
Next.js で PWA を実現するため next-pwa を利用する。
const withPWA = require('next-pwa')
const runtimeCaching = require('next-pwa/cache')
const nextConfig = {
  //
}
module.exports = withPWA(nextConfig)
:::