create-react-router で作成した React v19 アプリケーションにページ遷移を実装する

create-react-router で作成した React v19 アプリケーションにページ遷移を実装する

Clock Icon2025.05.24

こんにちは、製造ビジネステクノロジー部の若槻です。

昨年12月に React v19 がリリースされました。v18 から実に約3年ぶり()のメジャーバージョンアップです。
https://react.dev/blog/2024/12/05/react-19

そしてその React v19 のドキュメントを見ていると、アプリケーションの初期作成手順が以前に私が見ていた時からだいぶ変わっていることに気づきました。(もしかしたら前バージョン以前から変わっていたかも知れませんが)
https://ja.react.dev/learn/creating-a-react-app

具体的には、下記の3つのフレームワークのいずれかを選択してアプリケーションを初期化することがデフォルトの手順となっていました。

# Next.js (App Router)
npx create-next-app@latest

# React Router (v7)
npx create-react-router@latest

# Expo (ネイティブアプリ用)
npx create-expo-app@latest

以前までは Remix と NExt.js だったように記憶しており、(またもっと前には create-react-app だった気がするのですが、)現在は上記の3つなのですね。ただ React Router はフレームワークというよりはルーティングライブラリという位置づけでよく使っていたので、個人的には取っつきやすさがあります。

そこで今回は、create-react-router を使って作成した React v19 アプリケーションをにページ遷移の実装を行ってみました。

やってみた

create-react-router で アプリケーションの初期化

まずは、create-react-router を使ってアプリケーションを初期化します。選択メニューはすべて Enter キーを押してデフォルトのまま進めます。ここで気付いたのですが React Router のテンプレートは Remix のチームが提供しているのですね。

$ npx create-react-router@latest

         create-react-router v7.6.0

   dir   Where should we create your new project?
         ./my-react-router-app

      ◼  Using default template See https://github.com/remix-run/react-router-templates for more
      ✔  Template copied

   git   Initialize a new git repository?
         Yes

  deps   Install dependencies with npm?
         Yes

      ✔  Dependencies installed

      ✔  Git initialized

  done   That's it!

         Enter your project directory using cd ./my-react-router-app
         Check out README.md for development and deploy instructions.

         Join the community at https://rmx.as/discord

作成されたプロジェクトのディレクトリに移動します。

cd my-react-router-app

プロジェクト内のファイル構成は以下のようになっています。

$ tree -I ".react-router|node_modules"
.
├── app
│   ├── app.css
│   ├── root.tsx
│   ├── routes
│   │   └── home.tsx
│   ├── routes.ts
│   └── welcome
│       ├── logo-dark.svg
│       ├── logo-light.svg
│       └── welcome.tsx
├── Dockerfile
├── package-lock.json
├── package.json
├── public
│   └── favicon.ico
├── react-router.config.ts
├── README.md
├── tsconfig.json
└── vite.config.ts

デフォルトでインストールされたパッケージは以下の通りです。ビルドツールとして Vitest が、CSS フレームワークとして Tailwind CSS が導入されています。

$ npm ls
cdk_sample_app@0.1.0 /Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app
└─┬ my-react-router-app@ -> ./my-react-router-app
  ├── @react-router/dev@7.6.0
  ├── @react-router/node@7.6.0
  ├── @react-router/serve@7.6.0
  ├── @tailwindcss/vite@4.1.7
  ├── @types/node@20.17.50
  ├── @types/react-dom@19.1.5
  ├── @types/react@19.1.5
  ├── isbot@5.1.28
  ├── react-dom@19.1.0
  ├── react-router@7.6.0
  ├── react@19.1.0
  ├── tailwindcss@4.1.7
  ├── typescript@5.8.3
  ├── vite-tsconfig-paths@5.1.4
  └── vite@6.3.5

アプリケーションを起動してみます。

npm run dev

ブラウザで http://localhost:5173 にアクセスすると、以下のような画面が表示されます。

これで React v19 アプリケーションの create-react-router による初期化が完了しました。

ページ遷移の実装

続いて、ページ遷移の実装を行います。

まずは、app/routes/welcome.tsx というファイルを作成し、Welcome ページを実装します。

touch app/routes/welcome.tsx
app/routes/welcome.tsx
import { Welcome } from "../welcome/welcome";

export const meta = () => {
  return [
    { title: "Welcome - React Router App" },
    { name: "description", content: "Welcome page of our React Router app" },
  ];
};

const WelcomePage = () => {
  return <Welcome />;
};

export default WelcomePage;

次に、app/routes/home.tsx ファイルを編集して、React Router の Link を使い Welcome ページへのルーティングを追加します。

app/routes/home.tsx
import type { Route } from "./+types/home";
import { Link } from "react-router";

export const meta = ({}: Route.MetaArgs) => {
  return [
    { title: "New React Router App" },
    { name: "description", content: "Welcome to React Router!" },
  ];
};

const Home = () => {
  return (
    <div className="container mx-auto p-4">
      <h1 className="text-2xl font-bold mb-4">Home Page</h1>
      <p className="mb-4">Welcome to our React Router application!</p>

      <Link to="/welcome" className="text-blue-500 hover:underline">
        Go to Welcome Page
      </Link>
    </div>
  );
};

export default Home;

パスとページファイルの対応は、app/routes.ts ファイルで定義されています。下記ではデフォルトでは、app/routes/home.tsx/ パスに対応し、app/routes/welcome.tsx/welcome パスに対応しています。

app/routes.ts
import { type RouteConfig, index, route } from "@react-router/dev/routes";

export default [
  index("routes/home.tsx"),
  route("welcome", "routes/welcome.tsx")
] satisfies RouteConfig;

これで、/ パスにアクセスすると Home ページが表示され、Welcome ページへのリンクが表示されるようになりました。

Welcome ページへのリンクをクリックすると、Welcome ページが表示されました。

これで、React v19 アプリケーションにページ遷移を実装することができました。

404 ページの実装

ここまでの実装だと、存在しないパスにアクセスすると下記のように味気ないエラーページが表示されます。

そこで、存在しないパスにアクセスした場合の 404 ページを実装してみます。

まずは、app/routes/not-found.tsx というファイルを作成し、適当な 404 ページを実装します。

app/routes/not-found.tsx
import { Link } from "react-router";

export const meta = () => {
  return [
    { title: "404 - Page Not Found" },
    { name: "description", content: "Page not found" },
  ];
};

const NotFound = () => {
  return (
    <div className="p-4 text-center">
      <h1 className="text-2xl font-bold mb-2">404 - Page Not Found</h1>
      <p className="mb-4">The page you're looking for doesn't exist.</p>
      <Link to="/" className="text-blue-500 hover:underline">
        Return to Home
      </Link>
    </div>
  );
};

export default NotFound;

ポイントはルーティングの実装です。404ページのルートをワイルドカードパスとして最後に追加します。これにより、定義されていないパスにアクセスした場合にこのページが表示されるようになります。

my-react-router-app/app/routes.ts
import { type RouteConfig, index, route } from "@react-router/dev/routes";

export default [
  index("routes/home.tsx"),
  route("welcome", "routes/welcome.tsx"),
  route("*", "routes/not-found.tsx"), // 404ページのルートを最後に追加(ワイルドカードパスを使用)
] satisfies RouteConfig;

存在しないパスにアクセスすると、上記で実装した 404 ページが表示されるようになりました。

おわりに

今回は create-react-router で作成した React v19 アプリケーションにページ遷移を実装してみました。

以前までは react-router-dom を合わせて使っていた記憶もあるのですが、React Router v7 ではこのような実装になるのですね。今後 React アプリケーションを実装する際には、今回確認した内容がデフォルトの手順として参考になりそうです。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.