フロントエンドフレームワーク(React)を利用して開発したアプリケーションを GitHub Pages で公開するサンプル
React に代表されるフロントエンドフレームワークを利用して作ったアプリケーションは静的コンテンツとしてビルドできるので、理論上は GitHub Pages で公開して動かすことが可能である(認証サーバーや API サーバーなどは別として)。
だが実際にはいくつかの課題がある:
-
GitHub Pages で公開するウェブコンテンツはコンテンツルートが
/
ではなく/リポジトリ名
となる。その前提でアプリケーションが作られている必要がある -
上の問題に絡んで、React アプリケーションのルーティングに React Router が使われている場合は、その部分を考慮した上でパス設定を対応させる必要がある
-
同 React アプリケーションに限らないが、開発中は localhost を使って動作確認を行い、出来上がったものが GitHub Pages で公開されることになる。この2つの環境で同じように動作する必要がある。
これらの問題点を解決するサンプルとして公開する。
このサンプルは以下2つの内容を含む:
-
GitHub Pages 対応する前の React アプリケーション
-
リポジトリ内の
v0.1
タグを付けたもの-
ソースコードクローン(
$ git clone https://github.com/dotnsf/react-on-ghpages
)後にチェックアウトする場合は$ git checkout refs/tags/v0.1
-
これだけをクローンする場合は
$ git clone --depth 1 --branch v0.1 https://github.com/dotnsf/react-on-ghpages
-
-
GitHub Pages 対応を意識せずに作った React アプリケーション
-
/
,/a
,/b
という3つのパスで、それぞれPage0
,PageA
,PageB
の3つの画面を切り替えることができる-
このパスの切替に
react-router-dom
パッケージ内の React Router(BrowserRouter
,Routes
,Route
) を使っている -
src/App.js
参照
-
-
-
GitHub Pages 対応した後の React アプリケーション
-
リポジトリ内の
v0.2
タグを付けたもの(これがメイン)- ソースコードクローン(
$ git clone https://github.com/dotnsf/react-on-ghpages
)で取得できるもの
- ソースコードクローン(
-
上述の React アプリケーションを GitHub Pages にデプロイしても動くよう改良したもの
- localhost でも同様に動く
-
-
ソースコードを入手(以下2通りのいずれか)
-
ソースコード全体を取得後、タグを切り替える場合
-
$ git clone https://github.com/dotnsf/react-on-ghpages
-
$ cd react-on-ghpages
-
$ git checkout refs/tags/v0.1
-
-
対象の(
v0.1
タグの)ソースコードだけを取得する場合-
$ git clone --depth 1 --branch v0.1 https://github.com/dotnsf/react-on-ghpages
-
$ cd react-on-ghpages
-
-
-
localhost で実行
-
$ npm install
-
$ npm run start
-
ブラウザで
http://localhost:3000
にアクセス
-
-
この時点では
build/
フォルダを GitHub Pages としてデプロイしても正しく動かない-
ファイルパスがおかしい
-
そもそも
build/
フォルダは.gitignore
で指定されているので、登録が面倒
-
-
ソースコードを入手
-
$ git clone https://github.com/dotnsf/react-on-ghpages
-
$ cd react-on-ghpages
-
-
package.json
の 21 行目、PUBLIC_URL=
の値を自分が GitHub Pages で動かす際の URL パスに変更する- 例えば GitHub Pages の URL が
https://xxxx.github.io/react-on-ghpages
(xxxx
は GitHub ユーザー名)の場合であればPUBLIC_URL=/react-on-ghpages
とする
- 例えば GitHub Pages の URL が
-
localhost で実行
-
$ npm install
-
$ npm run start
-
ブラウザで
http://localhost:3000
にアクセス
-
-
GitHub Pages 対応済みブランチをビルドする
-
(念のため)
$ git checkout main
-
$ npm run build
-
-
ビルドした GitHub Pages 対応済みブランチを GitHub Pages にデプロイする
$ npm run deploy
-
GitHub Pages 上で実行
- 例えば上述と同じ場合の条件であれば、ブラウザで
https://xxxx.github.io/react-on-ghpages
にアクセス
- 例えば上述と同じ場合の条件であれば、ブラウザで
-
package.json
のbuild
スクリプト内で環境変数(PUBLIC_URL
)を指定してビルドしている(ここで単に localhost で実行する時と GitHub Pages 上にデプロイして実行する時とで異なる挙動になるのを実現している) -
src/App.js
内のルーティングのパスに上記環境変数PUBLIC_URL
を使ってパスを指定するようにしている-
例: <Route path={`${process.env.PUBLIC_URL}/a`} element={<PageA />} />
- 環境変数
PUBLIC_URL=/react-on-ghpages
が指定されている場合、path の値は/react-on-ghpages/a
になる(GitHub Pages で動かす場合) - 環境変数
PUBLIC_URL
が指定されていない場合、path の値は/a
になる(localhost で動かす場合)
- 環境変数
-
-
同様に
src/pages/Page0.js
,src/pages/PageA.js
,src/pages/PageB.js
でも互いのページに行き来する時の行先パスに環境変数PUBLIC_URL
を参照するように変更 -
package.json
にpostbuild
スクリプトを用意し、ビルドの最後にbuild/index.html
をbuild/404.html
にコピーしている。GitHub Pages だとトップページ以外のページの URL が変わるため、そのままだと 404 エラーが発生してしまう。404 エラーと判定されても、正しいページ内容が表示されるよう404.html
側をindex.html
で上書きする形で対応-
これらにより
$ npm run build
を実行すると GitHub Pages 用の環境変数が設定された状態でビルドされる -
ビルドではなく(ビルド前でもビルド後でも)
$ npm run start
を実行した場合は環境変数が設定されず、そのまま localhost で実行される (2つの環境向けに使い分けできる形が実現できている)
-
-
package.json
にdeploy
スクリプトを用意し、環境変数PUBLIC_URL
が設定された状態(つまり GitHub Pages 向けにビルドした状態)のビルド結果を GitHub Pages に push できるよう準備$ npm run deploy
で GitHub Pages 向けにビルドしてデプロイできる
2023 K.Kimura @ Juge.Me all rights reserved.