孅いエンジニアブログ

AstroでReact Routerを使用してハード404なCSRを作ってみた

Reactは使いたいけど、Next.jsはちょいややこしくて使いたくはないかも。でもReactは404ステータス返せないしなぁなときに使えるメモ。

Astroの中でReactを使うことができるので、それを利用して作ってみようと思った次第です。

使い方としては、pagesディレクトリ配下にページ分のastroを作る。

その中で共通のReact Routerコンポーネントを呼び出す。

---
import Main from "@/Main.astro";
---

<Main />

Mainはこんな感じ

---
import { Router } from "@/routes/Router";
---

<!doctype html>
<html lang="ja">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width" />
	</head>
	<body>
		<Router client:only />
	</body>
</html>

client:onlyはつける必要がある。

Router.tsxも作ります。

import { BrowserRouter, Route, Routes } from "react-router-dom";
import { Home } from "@/routes/pages/Home";
import { Portfolio } from "@/routes/pages/Portfolio";
import { Works } from "@/routes/pages/Works";
import { Links } from "@/routes/pages/Links";
import { About } from "@/routes/pages/About";
import { NotFound } from "@/routes/pages/NotFound";

export const Router = (): JSX.Element => {
	return (
		<BrowserRouter>
			<Routes>
				<Route path="/" element={<Home />} />
				<Route path="/portfolio" element={<Portfolio />} />
				<Route path="/contact" element={<Contact />} />
				<Route path="/works" element={<Works />} />
				<Route path="/links" element={<Links />} />
				<Route path="/about" element={<About />} />
				<Route path="*" element={<NotFound />} />
			</Routes>
		</BrowserRouter>
	);
};

ここで呼び出すコンポーネントはそれぞれReactで作ったページのコンポーネントを呼び出してください。Astroとルーティング用ファイルとReactとで二重になるのがちょっとめんどくさいところ。

するとReact Routerでページ遷移はできて、存在しないページにアクセスした場合は、pages配下にファイルがないため404を返してくれる。