技術情報

GitHub Pagesでreact-router-dom@v6を使って悩んだ話!


Warning: count(): Parameter must be an array or an object that implements Countable in /home/c9962019/public_html/mochinoki-labo.com/wp-content/plugins/rich-table-of-content/functions.php on line 490

こんにちは、MSKです。
ここ数日でReactとreact-router-domを使ったホームページを作っていて、それをGitHub Pagesで公開しました。
ところが、ローカルで動いていたアプリはデプロイすると真っ白なページしか表示されなくなりました。
この問題を解決したので備忘録として残します。

開発環境

今回の開発では主に以下を使いました。

  • React@v18
  • typescript
  • react-router-dom@v6
  • gh-pages@v4

react-router-dom@v6での実装

以下のブログではv5を使っていましたが、今回はv6を使います。
少し実装方法が変わったので、書いておきます。

Reactでページ遷移をやってみた!Reactでreact-router-domを使ってページ遷移を行ってみました。...

↑の記事と同じようにページを作っておきます。
例えば、

import React from 'react'
const Home= () => {
    return (
        <div>
            Home
        </div>
    )
}
export default Home;

のような感じです。

次に後で作るリンクと上で作ったコンポーネントを結びつけるコンポーネントを作ります。

import React from 'react';
import {BrowserRouter, Routes,Route} from 'react-router-dom';
/** ここに各ページをimport */

const RouteManager:React.FC = () => {
    return (
        <BrowserRouter>
            <Routes>
                <Route  path='/'  element={<Home />} />
                <Route  path='/about' element={<About/>}/>
                <Route  path='/works' element={<Works/>}/>
                <Route  path='/contact' element={<Contact />}/>
                <Route  path='*' element={<NotFound />}/>
            </Routes>
        </BrowserRouter>
    )
}

export default RouteManager;

ここがv5と違っていて、v5ではcomponentというプロパティにコンポーネント名を入れていましたが、v6ではelementにJSXとしての要素として設定します。

最後にリンクを作って、各ページを遷移できるようにします。

<nav>
    <Link to="/">
        <a>ホーム</a>
    </Link>
    <Link to="/about">
        <a>紹介</a>
    </Link>
    <Link to="/works">
        <a>作品集</a>
    </Link>
    <Link to="/contact">
        <a>お問い合わせ</a>
    </Link>
</nav>

これでローカルで実行してみると、上手く遷移できることが確認できました。

問題

GitHub Pagesにデプロイする準備をします。
gh-pagesをインストールして、次のようにpackage.jsonを編集します。

{
  "name": "my_app",
  "homepage": "https://<githubのユーザー名>.github.io/<このプロジェクトのgithubでのリポジトリ名>",
  "version": "0.1.0",
・・・・
"scripts": {
    "predeploy": "npm run build", 
    "deploy": "gh-pages -d build",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
・・・

homepageというフィールドを追加して、<>で囲まれた箇所に適切な名前を入力します。
scriptsフィールドにpredeployとdeployというフィールドを追記します。
これで準備OKなので、次のコマンドでgithubにデプロイします。

npm run deploy


publishedと出たら、GitHubの該当するリポジトリに移動して、Settingsからpagesを選択します。
sourceを設定します。
僕の場合はgh-pagesでデプロイした際に作成されるgh-pagesブランチを選択して、/rootフォルダを指定しました。
Actionsからデプロイが完了したことを確認して、URLを開いてみると真っ白なページしか表示されていませんでした。

原因と解決策

原因は上の設定ではルートがhttps://<GitHubのユーザー名>.github.io/とみなされるので、react-router-domで設定したpath=’/’はhttps://<GitHubのユーザー名>.github.io/とみなされているので、真っ白なページが表示されているということでした。

GitHub Pagesにデプロイする時にreact-router-domで設定しているpathとLinkを次のように設定するとちゃんと表示されました。

import React from 'react';
import {BrowserRouter, Routes,Route} from 'react-router-dom';
/** ここに各ページをimport */

const RouteManager:React.FC = () => {
    return (
        <BrowserRouter>
            <Routes>
                <Route  path='/<このプロジェクトのgithubでのリポジトリ名>/'  element={<Home />} />
                <Route  path='/<このプロジェクトのgithubでのリポジトリ名>/about' element={<About/>}/>
                <Route  path='/<このプロジェクトのgithubでのリポジトリ名>/works' element={<Works/>}/>
                <Route  path='/<このプロジェクトのgithubでのリポジトリ名>/contact' element={<Contact />}/>
                <Route  path='*' element={<NotFound />}/>
            </Routes>
        </BrowserRouter>
    )
}

export default RouteManager;

<nav>
    <Link to="/<このプロジェクトのgithubでのリポジトリ名>/">
        <a>ホーム</a>
    </Link>
    <Link to="/<このプロジェクトのgithubでのリポジトリ名>/about">
        <a>紹介</a>
    </Link>
    <Link to="/<このプロジェクトのgithubでのリポジトリ名>/works">
        <a>作品集</a>
    </Link>
    <Link to="/<このプロジェクトのgithubでのリポジトリ名>/contact">
        <a>お問い合わせ</a>
    </Link>
</nav>

この修正を行ってデプロイするとGitHub Pagesで作成したアプリが表示されました。

最後に

GitHub Pagesは簡単に無料でアプリを公開することができるので便利ですが、たまにひっかかる箇所があるので、忘れないようにブログにしました。

以上、「GitHub Pagesでreact-router-dom@v6を使って悩んだ!」でした。
ご覧いただき、ありがとうございました。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。