React Router v7のプレリリースが来たよ
React Router v7のプレリリース版が10月4日にリリースされていました。これを書いている現在の最新版は、7.0.0-pre.2です。
React Routerといえば、もともとは文字通りReact向けに開発されたルーティングライブラリなわけです。現在のようにNext.jsが台頭する前は、クライアントサイドルーティングを実現するライブラリとしてメジャーだったのですが、v6になってからは、何方かと言えばRemixというフルスタックフレームワークの一部として開発されていた印象です。
が、今回のアップデートではReact RouterとRemixがついに併合され、React Router v7というフルスタックフレームワークになります。
React Router v7では、React Router v6、Remix v2からの破壊的変更は最小限に留められています。また、プリレンダリングやRSCといった新しい機能が追加されます。ただRSCに関しては、まだ開発途中のようです(ドキュメントがない)。プリレンダリングに関しても、まだバグが多い印象です。
インストール
テンプレートがあるので、これを使うと簡単に使い始められます。my-app
は任意のディレクトリ名です。
$ npx degit remix-run/react-router/templates/basic#dev my-app
お好みのパッケージマネージャでinstall
します。
dev
コマンドで、開発サーバーが立ち上がります。
$ cd my-app
$ pnpm install
$ pnpm run dev
ルーティング
ルーティングについてはRemix v2から少し変更されて、routes.ts
という一つのファイルに全てのルートの設定を記述するのがデフォルトになったようです。
index(componentFile)
: 親パスをcomponentFile
で描画する。route(path, componentFile)
: 親パスにpath
を繋げたパスをcomponentFile
で描画する。layout(componentFile, children)
:children
の各ルートを、componentFile
の<Outlet />
のもとで描画する。パスは変化しない。prefix(prefixPath, routes)
:routes
の各ルートのパスの先頭にprefixPath
を繋げる。
公式ドキュメントから持ってきた例です。
import { type RouteConfig, route, index, layout, prefix } from "@react-router/dev/routes";
export const routes: RouteConfig = [
index("./home.tsx"),
route("about", "./about.tsx"),
layout("./auth/layout.tsx", [
route("login", "./auth/login.tsx"),
route("register", "./auth/register.tsx"),
]),
...prefix("concerts", [
index("./concerts/home.tsx"),
route(":city", "./concerts/city.tsx"),
route("trending", "./concerts/trending.tsx"),
]),
];
初見だと面食らいますが、これは次のような意味です。
URL
/
へのリクエストは、コンポーネント./home.tsx
によって描画される/about
は、./about.tsx
によって描画される/login
は、./auth/login.tsx
によって描画される。ただし、この描画結果は./auth/layout.tsx
の<Outlet />
に埋め込まれる/register
は、./auth/register.tsx
によって描画され、/login
と同様のレイアウトがなされる/concerts
は、./concerts/home.tsx