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