Future フラグと非推奨事項
このガイドでは、Remix アプリで Future フラグを採用するプロセスについて説明します。この戦略に従うことで、最小限の変更で Remix の次のメジャーバージョンにアップグレードできます。Future フラグの詳細については、開発戦略を参照してください。
各ステップの後でコミットを作成し、一度にすべてを行うのではなく、段階的にリリースすることを強くお勧めします。ほとんどのフラグは、以下に記載されている例外を除き、任意の順序で採用できます。
最新の v2.x への更新
まず、最新の Future フラグを含む v2.x の最新のマイナーバージョンに更新します。アップグレードすると、多くの非推奨警告が表示される可能性がありますが、それについては後で説明します。
👉 最新の v2 に更新
installGlobals
の削除
背景
以前は、Remix では fetch
ポリフィルをインストールする必要がありました。これは、installGlobals()
を呼び出すことによって実現されていました。
次のメジャーバージョンでは、Node 20 以上が必要になり、組み込みの fetch
サポートを利用できます。
注: miniflare/cloudflare worker を Remix プロジェクトで使用している場合は、互換性フラグが 2023-03-01
以降に設定されていることを確認してください。
👉 Node 20+ への更新
最新の偶数番号の Node LTS バージョンにアップグレードすることをお勧めします。
👉 installGlobals
の削除
Vite プラグインの採用
背景
Remix は、独自のクローズドコンパイラ(現在は「Classic Compiler」と呼ばれています)を使用しなくなり、代わりにViteを使用するようになりました。Vite は、JavaScript プロジェクト用の強力で高性能な拡張可能な開発環境です。パフォーマンス、トラブルシューティングなどについては、Vite ドキュメントを参照してください。
これは Future フラグではありませんが、新しい機能と一部の機能フラグは Vite プラグインでのみ使用可能であり、Classic Compiler は Remix の次のバージョンで削除されます。
👉 Vite のインストール
コードの更新
👉 ルートの remix.config.js
を vite.config.ts
に置き換えます
サポートされている Remix 設定オプション のサブセットは、プラグインに直接渡す必要があります。
👉 unstable_optimizeDeps
の追加(オプション)
多くのユーザーが、依存関係の自動最適化により、Vite プラグインの採用が容易になったことを発見しました。このため、unstable_optimizeDeps
フラグを Vite プラグインに追加しました。
このフラグは、React Router v7 まで「不安定」状態のままなので、React Router v7 にアップグレードする前に Remix v2 アプリでこれを使用する必要はありません。
👉 <LiveReload/>
の削除、<Scripts />
の保持
👉 tsconfig.json
の更新
tsconfig.json
のtypes
フィールドを更新し、skipLibCheck
、module
、moduleResolution
がすべて正しく設定されていることを確認します。
👉 remix.env.d.ts
の更新/削除
remix.env.d.ts
で以下の型宣言を削除します。
remix.env.d.ts
が空になった場合は、削除します。
パスエイリアスの設定
Vite はデフォルトではパスエイリアスを提供しません。~
をapp
ディレクトリのエイリアスとして定義するなど、この機能に依存していた場合は、vite-tsconfig-pathsプラグインをインストールして、Remixコンパイラの動作に合わせて、Viteでtsconfig.json
からのパスエイリアスを自動的に解決できます。
👉 vite-tsconfig-paths
のインストール
👉 Vite 設定へのvite-tsconfig-paths
の追加
@remix-run/css-bundle
の削除
Vite は、CSS サイドエフェクトインポート、PostCSS、CSS モジュールなど、他の CSS バンドル機能を組み込みでサポートしています。Remix Vite プラグインは、バンドルされた CSS を関連するルートに自動的に接続します。
@remix-run/css-bundle
cssBundleHref
エクスポートは常にundefined
になるからです。
👉 @remix-run/css-bundle
のアンインストール
👉 cssBundleHref
への参照の削除
links
で参照されているCSSインポートの修正
links
関数でCSSを参照している場合、対応するCSSインポートをViteの明示的な?url
インポート構文を使用するように更新する必要があります。
👉 links
で使用されているCSSインポートに?url
を追加
Tailwind CSSまたはVanilla Extractの移行
Tailwind CSSまたはVanilla Extractを使用している場合は、完全な移行ガイドを参照してください。
Remix App Serverからの移行
👉 dev
、build
、start
スクリプトの更新
👉 Vite devサーバーポートの設定(オプション)
カスタムサーバーの移行
カスタムサーバーまたはCloudflare Functionsを移行する場合は、完全な移行ガイドを参照してください。
MDXルートの移行
MDXを使用している場合は、公式のMDX Rollupプラグインを使用する必要があります。ステップバイステップのチュートリアルについては、完全な移行ガイドを参照してください。
v3_fetcherPersist
背景
フェッチャーのライフサイクルは、所有者コンポーネントのマウント解除時ではなく、アイドル状態に戻るようになったタイミングに基づいています。詳細については、RFC を参照してください。
👉 フラグの有効化
コードの更新
アプリに影響を与えることはほとんどありません。useFetchers
の使用状況を確認すると、以前よりも長く保持される場合があります。何をしているかによっては、以前よりも長くレンダリングされる場合があります。
v3_relativeSplatPath
背景
dashboard/*
など、複数セグメントのsplatパス(単なる*
に対して)の相対パスの一致とリンクを変更します。詳細については、CHANGELOG を参照してください。
👉 フラグの有効化
コードの更新
dashboard.$.tsx
やroute("dashboard/*")
のようにパスとsplatを持つルートがあり、その下に<Link to="relative">
や<Link to="../relative">
のような相対リンクがある場合、コードを更新する必要があります。
👉 ルートを2つに分割
splatルートについては、レイアウトルートとsplatを持つ子ルートに分割します。
👉 相対リンクの更新
そのルートツリー内の相対リンクを持つ<Link>
要素を更新して、追加の..
相対セグメントを含め、同じ場所にリンクし続けます。
v3_throwAbortReason
背景
ローダーが完了する前にユーザーがページから離れるなど、サーバー側のリクエストが中止された場合、Remix は new Error("query() call aborted...")
などのエラーではなく、request.signal.reason
をスローします。
👉 フラグの有効化
コードの更新
以前のエラーメッセージと一致させて他のエラーと区別するカスタムロジックがhandleError
内になかった限り、コードを調整する必要はありません。
v3_lazyRouteDiscovery
背景
このフラグを使用すると、Remix は初期ロード時にクライアントに完全なルートマニフェストを送信しなくなります。代わりに、サーバーでレンダリングされたルートのみをマニフェストに送信し、ユーザーがアプリケーション内を移動するにつれて残りのルートをフェッチします。詳細については、ドキュメントとブログ投稿を参照してください。
👉 フラグの有効化
コードの更新
この機能を動作させるためにアプリケーションコードを変更する必要はありません。
特定のリンクで積極的なルート検出を無効にしたい場合は、新しい<Link discover>
APIを使用できます。
v3_singleFetch
このフラグにはViteプラグインが必要です。
背景
このフラグを使用すると、Remix はクライアント側のナビゲーション中にデータ要求に単一のフェッチを使用します。これにより、データ要求をドキュメント要求と同じように処理することでデータの読み込みが簡素化され、ヘッダーやキャッシュを異なる方法で処理する必要がなくなります。高度なユースケースでは、詳細な再検証を選択することもできます。「Single Fetch」ドキュメントsingle-fetchを参照してください。
👉 フラグ(と型)の有効化
コードの更新
フラグを有効にしても、ほとんどの場合、コードをそのまま使用できますが、次の変更は時間をかけて行う必要があり、次のメジャーバージョンより前に必要になります。
👉 生のオブジェクトを優先してjson()
/defer()
を削除
Single Fetch は JSON オブジェクトと Promise をすぐにサポートしているので、loader
/action
関数から生のデータ返すことができます。
json
/defer
の2番目のパラメーターを使用して、レスポンスにカスタムステータスまたはヘッダーを設定していた場合、新しいdata
APIを使用して引き続きそれらの値を設定できます。
👉 サーバーのタイムアウトの調整
entry.server.tsx
ファイルでカスタムABORT_DELAY
を使用していた場合は、Single Fetchによって利用される新しいstreamTimeout
APIを使用するように変更する必要があります。
v3_routeConfig
このフラグにはViteプラグインが必要です。
設定ベースのルーティングは、React Router v7の新しいデフォルトであり、アプリディレクトリのroutes.ts
ファイルで設定されます。Remixでのroutes.ts
とその関連APIのサポートは、RemixプロジェクトをReact Router v7に移行する際に必要な変更を最小限に抑えるための移行パスとして設計されています。@remix-run
スコープ内に新しいパッケージがいくつか導入されましたが、これらの新しいパッケージは、routes.ts
のコードをReact Router v7の同等のコードと可能な限り似せておくためだけに存在します。
v3_routeConfig
Futureフラグが有効になっている場合、Remixの組み込みファイルシステムルーティングは無効になり、プロジェクトはReact Router v7の設定ベースのルーティングを選択するようになります。Remixのファイルベースのルーティングを引き続き使用したい場合は、以下でroutes.ts
での有効化方法について説明します。
コードの更新
Remixのファイルシステムルーティングとルート設定をReact Router v7の同等の設定に移行するには、次の手順に従ってください。
👉 フラグの有効化
👉 @remix-run/route-config
のインストール
このパッケージはReact Router v7の@react-router/dev/routes
のAPIと一致するため、React Router v7への移行をできるだけ容易にします。
これにより、コアRouteConfig
型と、コードでルートを設定するためのヘルパーのセットが提供されます。
👉 ルートが設定されていないapp/routes.ts
ファイルを追加
これは、新しいroutes.ts
ファイルが正常に取得されていることを確認する良い方法です。ルートが定義されていないため、アプリは空白ページをレンダリングするはずです。
👉 @remix-run/fs-routes
をインストールしてroutes.ts
で使用
このパッケージはReact Router v7の@react-router/fs-routes
のAPIと一致するため、React Router v7への移行をできるだけ容易にします。
ignoredRouteFiles
を["**/*"]
に設定している場合は、Remixのファイルシステムルーティングを既にオプトアウトしているため、この手順をスキップしてください。
👉 routes
設定オプションを使用していた場合は、@remix-run/routes-option-adapter
をインストールしてroutes.ts
で使用
Remixは、コードでルートを定義し、代替のファイルシステムルーティング規則をプラグインするためのメカニズムを提供します。これは、Viteプラグインのroutes
オプションを介して利用できます。
移行を容易にするために、Remixのroutes
オプションをReact RouterのRouteConfig
配列に変換するアダプターパッケージが用意されています。
まず、アダプターをインストールします。
このパッケージはReact Router v7の@react-router/remix-routes-option-adapter
のAPIと一致するため、React Router v7への移行をできるだけ容易にします。
次に、routes.ts
ファイルを更新してアダプターを使用し、routes
オプションの値をremixRoutesOptionAdapter
関数に渡します。この関数は、設定されたルートの配列を返します。
たとえば、remix-flat-routesのような代替のファイルシステムルーティング実装を使用するためにroutes
オプションを使用していた場合:
または、設定ベースのルートを定義するためにroutes
オプションを使用していた場合:
このように設定ベースのルートを定義している場合は、古いAPIと非常に似ていますが、より合理化されている新しいルート設定APIに移行することを検討してください。たとえば、上記のルートは次のようになります。
異なるルート設定アプローチを混在させる必要がある場合は、それらを1つのルート配列にマージできます。RouteConfig
型により、すべてが有効なままになります。
非推奨事項
@remix-run/eslint-config
@remix-run/eslint-config
パッケージは非推奨となり、React Router v7には含まれません。Remixテンプレートに含まれるものなど、簡素化されたESLint設定に移行することをお勧めします。
json
このユーティリティは非推奨であり、React Router v7ではSingle Fetchのネイキッドオブジェクトの返却に置き換えられます。
- データのシリアライズ(
Date
オブジェクトの文字列化など)にjson
に依存していなかった場合は、安全に削除できます。 json
を使用してheaders
またはstatus
を返していた場合は、新しいdataユーティリティをドロップイン置換として使用してこれらの値を設定できます。- データをJSONにシリアライズする場合は、ネイティブのResponse.json()メソッドを使用できます。
詳細については、Single Fetchのドキュメントを参照してください。
defer
このユーティリティは非推奨であり、React Router v7ではSingle Fetchのネイキッドオブジェクトの返却に置き換えられます。
defer
を使用してheaders
またはstatus
を返していた場合は、新しいdataユーティリティをドロップイン置換として使用してこれらの値を設定できます。
詳細については、Single Fetchのドキュメントを参照してください。
SerializeFrom
この型は非推奨であり、React Router v7では削除されます。Single FetchはデータのJSONへのシリアライズを行わなくなったためです。
SerializeFrom
を使用してloader
/action
データのラップを解除している場合は、次のようなカスタム型を使用できます。
ほとんどの場合、SerializeFrom
を削除してuseLoaderData
/useActionData
から返される型、またはloader
/action
関数内のデータの型を使用できます。