Remixからのアップグレード
React Router v7は、v2に続くRemixの次のメジャーバージョンです(詳しくは、弊社の「React 19への段階的な移行」ブログ投稿をご覧ください)。
Remix v2の将来的なフラグをすべて有効にしている場合、Remix v2からReact Router v7へのアップグレードは、主に依存関係の更新を伴います。
手順2~8の大部分は、コミュニティメンバーであるJames Restallによって作成されたコードモッドを使用して自動的に更新できます。
1. 将来的なフラグの採用
👉 将来的なフラグを採用する
Remix v2アプリケーションで、既存のすべての将来的なフラグを採用します。
2. 依存関係の更新
以前はランタイム固有のパッケージ(@remix-run/node
, @remix-run/cloudflare
など)を通して再エクスポートされていた「共有」APIのほとんどは、v7ではreact-router
に統合されました。そのため、@react-router/node
または@react-router/cloudflare
からインポートする代わりに、react-router
から直接インポートします。
v7でランタイム固有のパッケージからインポートする必要があるAPIは、NodeのcreateFileSessionStorage
やCloudflareのcreateWorkersKVSessionStorage
など、そのランタイムに固有のAPIのみです。
👉 コードモッドを実行する(自動化)
以下のコードモッドを使用して、パッケージとインポートを自動的に更新できます。このコードモッドは、すべてのパッケージとインポートを更新します。元に戻す必要がある場合に備えて、コードモッドを実行する前に、保留中の変更をコミットしてください。
👉 新しい依存関係をインストールする
コードモッドが依存関係を更新した後、Remixパッケージを削除し、新しいReact Routerパッケージを追加するために、依存関係をインストールする必要があります。
プレリリース版である間は、package.json
を更新して、react-router
パッケージのプレリリース版を指定する必要があります。
👉 依存関係を更新する(手動)
コードモッドを使用しない場合は、手動で依存関係を更新できます。
アルファベット順のパッケージ名の変更を表形式で表示する
Remix v2パッケージ | React Router v7パッケージ | |
---|---|---|
@remix-run/architect | ➡️ | @react-router/architect |
@remix-run/cloudflare | ➡️ | @react-router/cloudflare |
@remix-run/dev | ➡️ | @react-router/dev |
@remix-run/express | ➡️ | @react-router/express |
@remix-run/fs-routes | ➡️ | @react-router/fs-routes |
@remix-run/node | ➡️ | @react-router/node |
@remix-run/react | ➡️ | react-router |
@remix-run/route-config | ➡️ | @react-router/dev |
@remix-run/routes-option-adapter | ➡️ | @react-router/remix-routes-option-adapter |
@remix-run/serve | ➡️ | @react-router/serve |
@remix-run/server-runtime | ➡️ | react-router |
@remix-run/testing | ➡️ | react-router |
package.json
のscripts
の変更
3. コードモッドを使用した場合は、この手順は自動的に完了しているのでスキップできます。
👉 package.json
のスクリプトを更新する
スクリプト | Remix v2 | React Router v7 | |
---|---|---|---|
dev | remix vite:dev | ➡️ | react-router dev |
build | remix vite:build | ➡️ | react-router build |
start | remix-serve build/server/index.js | ➡️ | react-router-serve build/server/index.js |
typecheck | tsc | ➡️ | react-router typegen && tsc |
routes.ts
ファイルの追加
4. コードモッドとRemix v2のunstable_routeConfig
フラグを使用した場合は、この手順は自動的に完了しているのでスキップできます。
React Router v7では、app/routes.ts
ファイルを使用してルートを定義します。詳しくは、ルーティングに関するドキュメントをご覧ください。
👉 依存関係の更新(Remix v2のunstable_routeConfig
フラグを使用している場合)
👉 routes.ts
ファイルの追加(Remix v2のunstable_routeConfig
フラグを使用していない場合)
後方互換性のため、そしてファイルベースの規約を好む人のために、Remix v2で使用しているのと同じ「フラットルート」規約を、新しい@react-router/fs-routes
パッケージを介して選択できます。
または、routes
オプションを使用して設定ベースのルートを定義していた場合:
vite.config.ts
でroutes
オプションを使用していた場合は、削除してください。
5. React Router設定の追加
👉 プロジェクトにreact-router.config.ts
を追加する
以前はvite.config.ts
のremix
プラグインに渡されていた設定は、現在react-router.config.ts
からエクスポートされています。
注:この時点で、手順1で追加したv3の将来的なフラグを削除する必要があります。
vite.config
へのReact Routerプラグインの追加
6. コードモッドを使用した場合は、この手順は自動的に完了しているのでスキップできます。
👉 vite.config
にreactRouter
プラグインを追加する
vite.config.ts
を変更して、@react-router/dev/vite
から新しいreactRouter
プラグインをインポートして使用します。
7. 型安全性の有効化
TypeScriptを使用していない場合は、この手順をスキップできます。
React Routerは、ルートモジュールの型をアプリのルートにある.react-router/
ディレクトリに自動的に生成します。このディレクトリはReact Routerによって完全に管理されており、.gitignore
に追加する必要があります。新しい型安全性の機能の詳細については、こちらをご覧ください。
👉 .gitignore
に.react-router/
を追加する
👉 tsconfig.json
を更新する
tsconfig.json
のtypes
フィールドを更新して、以下を含めます。
include
フィールドに.react-router/types/**/*
パスtypes
フィールドに適切な@react-router/*
パッケージ- 簡素化された相対インポートのための
rootDirs
8. エントリファイル内のコンポーネントの名前変更
コードモッドを使用した場合は、この手順は自動的に完了しているのでスキップできます。
アプリケーションにentry.server.tsx
と/またはentry.client.tsx
ファイルがある場合は、これらのファイルのメインコンポーネントを更新する必要があります。
AppLoadContext
の型の更新
9. remix-serve
を使用していた場合は、この手順をスキップできます。これは、Remix v2でカスタムサーバーを使用していた場合にのみ適用されます。
React RouterはReactフレームワークとスタンドアロンのルーティングライブラリの両方として使用できるため、LoaderFunctionArgs
とActionFunctionArgs
のcontext
引数は、デフォルトではオプションでany
型になります。ローダーとアクションの型安全性を確保するために、ロードコンテキストの型を登録できます。
👉 ロードコンテキストの型の登録
新しいRoute.LoaderArgs
とRoute.ActionArgs
型に移行する前に、LoaderFunctionArgs
とActionFunctionArgs
をロードコンテキスト型で一時的に拡張して、移行を容易にすることができます。
型を登録するためにdeclare module
を使用することは、モジュール拡張と呼ばれる標準的なTypeScriptテクニックです。これは、tsconfig.json
のinclude
フィールドに含まれる任意のTypeScriptファイルで行うことができますが、アプリディレクトリ内の専用のenv.d.ts
を使用することをお勧めします。
👉 新しい型の使用
新しい型生成を採用したら、LoaderFunctionArgs
/ActionFunctionArgs
の拡張を削除し、代わりにRoute.LoaderArgs
とRoute.ActionArgs
からcontext
引数を使用します。
おめでとうございます!これでReact Router v7に移行できました。アプリケーションを実行して、すべてが期待通りに動作していることを確認してください。