個人で、React
アプリを作成し、Github Pages
で公開したのですが、BrowserRouter
を使用した複数ページの表示がうまく動作しない問題にハマったので、解決方法を記載します。
因みに、学習結果としてのソースコード、公開しているページのリンクは以下なので、興味があれば閲覧ください!
ソースコード
公開ページ
環境
- windows11
-
react-router-dom
バージョン:6.21.1
※バージョン5.x.x
を使用した際、実装方法が異なります。 -
gh-pages
バージョン:6.1.1
※package.json
に手を加えて、npm run deploy
の実行で、gh-pages
ブランチに変更内容が直接プッシュされるような状態になっています。
原因
先に原因を記載しておくと、Github Pages
でreact-router-dom
を使用したページ遷移を行った際、正しく遷移・処理が行えず、404.html
へ遷移してしまうというのが原因でした。
解決方法として、404.html
の読み込み時にindex.html
と同じ内容を読み込ませることで解決できました。
具体的な方法は、以下に記載します。
package.json
の修正
scripts
のbuild
の記載を、以下の様に修正します。
修正により、build
時にindex.html
を404.html
へコピーする処理が走ります。
※ cp
コマンドでコピーを行っているため、git bash
が使えることが前提となります。
{
"scripts": {
"build": "react-scripts build && cp build/index.html build/404.html",
.... // 以下は、deploy 時に、gh-pagesブランチへプッシュするための設定
"deploy": "gh-pages -d build",
その他
そもそも、初期ページが表示できないという場合は、BrowserRouter
にbasename={process.env.PUBLIC_URL}
を記載するか、各ページのパスに対して、自身のリポジトリ名を追加する様な修正が必要です。
const App = () => {
// 各ページのパス設定
return <BrowserRouter basename={process.env.PUBLIC_URL}>
<Routes>
<Route path='/' element={<Home />} />
<Route path='/author' element={<Author />} />
<Route path='/report' element={<Reports />} />
</Routes>
</BrowserRouter>;
};
各ページのパスを修正するなら、以下
※ 私が作ったサンプルだと、sample_react_ts
がリポジトリ名となります。
const APP_NAME: String = "sample_react_ts"; // これが、リポジトリ名
const App = () => {
// 各ページのパス設定
return <BrowserRouter>
<Routes>
<Route path={APP_NAME + '/'} element={<Home />} />
<Route path={APP_NAME + '/author'} element={<Author />} />
<Route path={APP_NAME + '/report'} element={<Reports />} />
</Routes>
</BrowserRouter>;
};