
create-react-router で作成した React v19 アプリケーションにページ遷移を実装する
こんにちは、製造ビジネステクノロジー部の若槻です。
昨年12月に React v19 がリリースされました。v18 から実に約3年ぶり(※)のメジャーバージョンアップです。
そしてその React v19 のドキュメントを見ていると、アプリケーションの初期作成手順が以前に私が見ていた時からだいぶ変わっていることに気づきました。(もしかしたら前バージョン以前から変わっていたかも知れませんが)
具体的には、下記の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
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 ページへのルーティングを追加します。
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
パスに対応しています。
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 ページを実装します。
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ページのルートをワイルドカードパスとして最後に追加します。これにより、定義されていないパスにアクセスした場合にこのページが表示されるようになります。
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 アプリケーションを実装する際には、今回確認した内容がデフォルトの手順として参考になりそうです。
以上