Closed10

Remix v2 -> React Route v7 にアップデートする

kosuke itokosuke ito

If you have enabled all Remix v2 future flags, upgrading from Remix v2 to React Router v7 mainly involves updating dependencies.
すべてのRemix v2のフューチャーフラグを有効にしている場合、Remix v2からReact Router v7へのアップグレードは主に依存関係の更新を伴います。

とあるので、確認したら一部有効にしていそう

vite.config.ts
export default defineConfig({
...
..
  plugins: [
    remix({
      future: {
        v3_fetcherPersist: true,
        v3_relativeSplatPath: true,
        v3_throwAbortReason: true,
      },
    }),
   ...
  ..
kosuke itokosuke ito

The majority of steps 2-8 can be automatically updated using a codemod created by community member James Restall.
ステップ2~8の大部分は、コミュニティメンバーのJames Restallが作成したcodemodを使って自動的に更新できる。

とあるので、まずステップ1をやって、その後codemodでゴリっと変換してもらおう

codemodとは?
https://codemod.com/
https://ascii.jp/elem/000/001/518/1518629/#:~:text=アップデートできます。-,Codemod,-Codemodは、Facebook

kosuke itokosuke ito

Future Flags and Deprecations

Update to latest v2

remix-runの関連ライブラリをv2の最新バージョンにアップデートする

2.15.0が最新

package.json
- "@remix-run/node": "^2.13.1",
- "@remix-run/react": "^2.13.1",
- "@remix-run/serve": "^2.13.1",
- "@remix-run/dev": "^2.13.1",

+ "@remix-run/node": "^2.15.0",
+ "@remix-run/react": "^2.15.0",
+ "@remix-run/serve": "^2.15.0",
+ "@remix-run/dev": "^2.15.0",
$ pnpm install

dependencies:
- @remix-run/node 2.13.1
+ @remix-run/node 2.15.0
- @remix-run/react 2.13.1
+ @remix-run/react 2.15.0
- @remix-run/serve 2.13.1
+ @remix-run/serve 2.15.0

devDependencies:
- @remix-run/dev 2.13.1
+ @remix-run/dev 2.15.0

Done in 7.6s

Remove installGlobals

Update to Node 20+

$ node -v
v21.6.2

Remove installGlobals

自分の場合は、記述がなかった

Adopt the Vite Plugin

現在のアプリを作成時にViteをインストール済

vite.config.ts
remix({
+   ignoredRouteFiles: ['**/*.css'],
      future: {
        v3_fetcherPersist: true,
        v3_relativeSplatPath: true,
        v3_throwAbortReason: true,
+      unstable_optimizeDeps: true,
      },
    }),

Migrate Tailwind CSS or Vanilla Extract

https://remix.run/docs/en/main/guides/vite#enable-tailwind-via-postcss

Adjust your server abort delay

entry.server.tsx
- const ABORT_DELAY = 5_000


- abortDelay={ABORT_DELAY}

追記;他にもABORT_DELAYが記述されている箇所があったので、削除した

v3_routeConfig

v3_routeConfigフラグを有効にすると、Remixのビルトインのファイルシステムルーティングが無効になり、React Router v7の設定ベースのルーティングに切り替わる

自分はファイルシステムルーティングを使用したいので、このフラグを有効にしない

kosuke itokosuke ito

ルーティング

Remix v2のunstable_routeConfigフラグを使用せずに、ファイルシステムルーティングを引き続き使用するためのセットアップを行う。

Future Flagページのルーティングの章の説明がわかりにくかったので、Upgrading From Remixの Add a routes.ts fileの章を参照する。

https://reactrouter.com/upgrading/remix#4-add-a-routests-file

ルーティグの説明は以下を参照すると良いっぽい

https://reactrouter.com/how-to/file-route-conventions

セットアップ

pnpm i @react-router/fs-routes

routes.ts ファイルの追加

touch app/routes.ts
app/routes.ts
import { type RouteConfig } from "@react-router/dev/routes";
import { flatRoutes } from "@react-router/fs-routes";

export default flatRoutes() satisfies RouteConfig;

vite.config.tsでroutesオプションを使用しているので削除する。

vite.config.ts
remix({
-     ignoredRouteFiles: ['**/*.css'],
      future: {
        v3_fetcherPersist: true,
        v3_relativeSplatPath: true,
        v3_throwAbortReason: true,
        v3_lazyRouteDiscovery: true,
        v3_singleFetch: true,
        unstable_optimizeDeps: true,
      },
    }),
kosuke itokosuke ito

codemodで2~8は自動で行われると記述があったが、自分が実行した際に 7. Enable type safety が行われていなかったので、先にやっておくと良さそう

.gitignore
+ .react-router/
tsconfig.json
{
  "include": [
    /* ... */
+   ".react-router/types/**/*"
  ],
  "compilerOptions": {
-   "types": ["@remix-run/node", "vite/client"],
+   "types": ["@react-router/node", "vite/client"],
    /* ... */
+   "rootDirs": [".", "./.react-router/types"]
  }
}

2. Update dependencies

ここまででFuture Flagページに書かれていることは全てやったので、codemodを使用してアップデート作業を行う

codemodを実行する。
React Router 7に合わせたコードに変更される。

$ npx codemod remix/2/react-router/upgrade

React Routerのパッケージが入っていないので、変更されたpackage.jsonで新しい依存関係をインストールする

$ pnpm i
kosuke itokosuke ito

9. Update types for

この章は自分は関係ないので、終わり

kosuke itokosuke ito
  • Config-based routing: React Router v7の新しいルーティング
    • appディレクトリのroutes.tsファイルで設定する
    • v3_routeConfigフラグを有効にすると、Remixのビルトインファイルシステムルーティングが無効になり、React Router v7の設定ベースのルーティングに切り替わる
  • fs-routes: React Router v7のルーティングに使用するパッケージ

https://remix.run/docs/en/main/start/future-flags#v3_routeconfig

もう少しまとめるが、以下のコードを追加したことで動くようになった

vite.config.ts
import { reactRouter } from '@react-router/dev/vite'
import { defineConfig } from 'vite'
import tsconfigPaths from 'vite-tsconfig-paths'

export default defineConfig({
  plugins: [reactRouter(), tsconfigPaths()],
})
  • flatRoutes()によって、routesからファイルベースルーティングを行ってくれるっぽい
app/routes.ts
import { type RouteConfig } from '@react-router/dev/routes'
import { flatRoutes } from '@react-router/fs-routes'

export default flatRoutes() satisfies RouteConfig
react-router.config.ts
+import type { Config } from "@react-router/dev/config";
+export default {
+  ssr: true,
+} satisfies Config;

補足

flatRoutes()の中身を変更することでベースパスを変更することもできる

import { type RouteConfig } from "@react-router/dev/routes";
import { flatRoutes } from "@react-router/fs-routes";

export default flatRoutes({
  rootDirectory: "file-routes",
}) satisfies RouteConfig;

https://reactrouter.com/how-to/file-route-conventions#basic-routes

このスクラップは2025/01/19にクローズされました