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を返してくれる。