v6 からのアップグレード
React Router v7 では、以下の最小バージョンが必要です。
node@20
react@18
react-dom@18
v7 へのアップグレードは、すべての future フラグを有効にしている場合は、破壊的な変更はありません。これらのフラグを使用すると、アプリを一度に 1 つずつ変更できます。一度にすべてを行うのではなく、各ステップの後にコミットして出荷することを強くお勧めします。
最新の v6.x に更新する
まず、最新の future フラグとコンソール警告を取得するために、v6.x の最新のマイナーバージョンに更新します。
👉 最新の v6 に更新する
v7_relativeSplatPath
背景
dashboard/*
(単なる *
ではなく) のような複数セグメントのスプラットパスの相対パスのマッチングとリンクを変更します。詳細については、CHANGELOG を参照してください。
👉 フラグを有効にする
フラグの有効化は、ルーターのタイプによって異なります。
コードを更新する
<Route path="dashboard/*">
のようにパスとスプラットを持つルートがあり、その下に <Link to="relative">
や <Link to="../relative">
のような相対リンクがある場合は、コードを更新する必要があります。
👉 <Route>
を 2 つに分割する
複数セグメントのスプラット <Route>
を、パスを持つ親ルートとスプラットを持つ子ルートに分割します。
👉 相対リンクを更新する
そのルートツリー内の <Link>
要素を、同じ場所にリンクし続けるために、追加の ..
相対セグメントを含めるように更新します。
v7_startTransition
背景
これは、ルーターの状態更新に React.useState
の代わりに React.useTransition
を使用します。詳細については、CHANGELOG を参照してください。
👉 フラグを有効にする
👉 コードを更新する
コンポーネントの 内部 で React.lazy
を使用している場合を除き、何も更新する必要はありません。
コンポーネントの内部で React.lazy
を使用することは、React.useTransition
(またはコンポーネントの内部で Promise を作成するその他のコード) と互換性がありません。React.lazy
をモジュールスコープに移動し、コンポーネントの内部で Promise を作成するのをやめてください。これは React Router の制限ではなく、React の誤った使用法です。
v7_fetcherPersist
<RouterProvider>
を使用していない場合は、これをスキップできます
背景
フェッチャーのライフサイクルは、所有者コンポーネントがアンマウントされたときではなく、アイドル状態に戻ったときに基づくようになりました。詳細については、CHANGELOG を参照してください。
フラグを有効にする
コードを更新する
アプリに影響を与える可能性は低いでしょう。以前よりも長く持続する可能性があるため、useFetchers
の使用状況を確認することをお勧めします。何をしているかによっては、以前よりも長くレンダリングされる場合があります。
v7_normalizeFormMethod
<RouterProvider>
を使用していない場合は、これをスキップできます
これは、fetch()
の動作に合わせて、formMethod
フィールドを大文字の HTTP メソッドとして正規化します。詳細については、CHANGELOG を参照してください。
👉 フラグを有効にする
コードを更新する
コードのいずれかが小文字の HTTP メソッドをチェックしている場合は、大文字の HTTP メソッドをチェックするように更新する必要があります (または、toLowerCase()
を呼び出す必要があります)。
👉 formMethod
を大文字と比較する
v7_partialHydration
<RouterProvider>
を使用していない場合は、これをスキップできます
これは、主に SSR フレームワークで使用されるデータルーターの部分的なハイドレーションを有効にしますが、ルートモジュールをロードするために lazy
を使用している場合にも役立ちます。これを心配する必要はほとんどありません。フラグをオンにするだけです。詳細については、CHANGELOG を参照してください。
👉 フラグを有効にする
コードを更新する
部分的なハイドレーションでは、初期ハイドレーション中にレンダリングする HydrateFallback
コンポーネントを提供する必要があります。さらに、以前に fallbackElement
を使用していた場合は、非推奨になったため削除する必要があります。ほとんどの場合、fallbackElement
を HydrateFallback
として再利用することをお勧めします。
👉 fallbackElement
を HydrateFallback
に置き換える
v7_skipActionErrorRevalidation
createBrowserRouter
を使用していない場合は、これをスキップできます
このフラグが有効になっている場合、アクションが 4xx
/5xx
ステータスコードで Response
をスロー/返す場合、ローダーはデフォルトで再検証されなくなります。これらのシナリオでは、shouldRevalidate
と actionStatus
パラメーターを使用して再検証を選択できます。
👉 フラグを有効にする
コードを更新する
ほとんどの場合、アプリのコードを変更する必要はないでしょう。通常、アクションがエラーになった場合、データが変更されて再検証が必要になる可能性は低いでしょう。コードのいずれかがアクションエラーシナリオでデータを 変更する 場合は、2 つのオプションがあります。
👉 オプション 1: エラーシナリオでの変更を避けるように action
を変更する
👉 オプション 2: shouldRevalidate
と actionStatus
を使用して再検証を選択する
非推奨
json
および defer
メソッドは、生のオブジェクトを返すことが推奨されるため、非推奨になりました。
json
を使用してデータを JSON にシリアル化していた場合は、代わりにネイティブの Response.json() メソッドを使用できます。
v7 にアップグレードする
アプリが追いついたので、問題なく v7 に更新できます (理論的には!)。
👉 v7 をインストールする
👉 react-router-dom を react-router に置き換える
v7 では、パッケージが簡素化されたため、"react-router-dom"
は不要になりました。"react-router"
からすべてをインポートできます。
package.json には "react-router"
のみが必要であることに注意してください。
👉 インポートを更新する
次に、インポートを更新して react-router
を使用する必要があります。
インポートを手動で更新する代わりに、このコマンドを使用できます。ただし、期待どおりに動作しない場合に元に戻せるように、git のワーキングツリーがクリーンであることを確認してください。
GNU sed
がインストールされている場合 (ほとんどの Linux ディストリビューション)、代わりにこのコマンドを使用します。
👉 DOM 固有のインポートを更新する
RouterProvider
と HydratedRouter
は、"react-dom"
に依存するため、深いインポートから取得されます。
Jest テストなど、DOM 以外のコンテキストでは、トップレベルのインポートを使用する必要があることに注意してください。
おめでとうございます。これで v7 になりました。