戦争の霧

これは不安定なAPIであり、今後も変更され続けるため、本番環境では使用しないでください

Remix は v2.10.0future.unstable_fogOfWar Future Flag 経由で "Fog of War" (RFC) のサポートを導入しました。これにより、この動作をオプトインすることができます。この動作は Remix の次のメジャーバージョン、つまり React Router v7 (12) でデフォルトになります。

現在の動作

現在、Remix は初期ロード時にルートマニフェスト全体を JS ファイル (例: /assets/manifest-[hash].js) にロードします。マニフェストには、ルートモジュールの実装は含まれていませんが、その URL パスとメタ情報 (ルートの JS/CSS インポート、サーバーに loader / action があるかどうかなど) が含まれています。この完全なマニフェストを事前に取得することで、Remix はリンククリック時に同期的にクライアント側でルートマッチングを行い、ルートモジュールとデータのロードをすぐに開始することができます。小規模から中規模のアプリケーションでは、完全なマニフェストを事前にロードすることは、通常はそれほど負担になりません。これは、高度にキャッシュ可能で、非常に効率的に gzip 圧縮されるためです。しかし、規模が大きくなると、このマニフェストが大きくなりすぎて、一部のパフォーマンス指標に影響を与えることがわかりました。

新しい動作

"Fog of War" を有効にすると、Remix は初期ロード時に完全なルートマニフェストを送信しなくなります。代わりに、SSR レンダリングには初期マニフェストに SSR ルートのみが含まれ、ユーザーがアプリケーション内を移動するにつれて追加のルートがロードされます。時間とともに、マニフェストはユーザーが移動したアプリケーションの部分を含むように拡張されます。

熱心なルート発見

常にそうですが、この種の遅延ルート発見にはトレードオフがあります。初期のアプリケーションロード時間は向上しますが、Remix はリンククリック時に同期的なルートマッチングを実行できなくなり、ウォーターフォールが発生する可能性があります。

現在のアーキテクチャ ( <Link prefetch> を使用しない場合) では、リンクをクリックすると、次のような動作になります。

click /a
        |-- ルートモジュールをロード -->
        |-- ルートデータをロード -->
                                 | /a をレンダリング

Fog of War アーキテクチャでは、リンクをクリックするとウォーターフォールが発生する可能性があります。

click /a
        |-- ルートを発見 -->
                              |-- ルートモジュールをロード -->
                              |-- ルートデータをロード -->
                                                       | /a をレンダリング

ご存知のとおり、Remix はウォーターフォールを嫌います。そのため、Fog of War 機能では、ほとんどの場合、ウォーターフォールを回避するための最適化が実装されています。デフォルトでは、ページにレンダリングされたすべての <Link><NavLink> コンポーネントはバッチ処理され、サーバーへのリクエストによって熱心に "発見" されます。このリクエストは、サーバー上の現在のすべてのリンクパスと一致し、必要なすべてのルートマニフェストエントリを送信します。ほとんどの場合、このリクエストはユーザーがリンクをクリックする前に完了するはずです (ユーザーは通常、最初の数ミリ秒の間はリンクをクリックしないため)。マニフェストは、リンクがクリックされる前にパッチされます。次に、リンクがクリックされると、Remix は Fog of War の動作がなくても、同期的にクライアント側でマッチングを実行することができます。

リンクごとにこの熱心なルート発見をオプトアウトしたい場合は、discover="none" プロパティを使用して実行できます (デフォルト値は discover="render" です)。

注目すべき変更点

  • この機能が有効になっている場合、window.__remixManifest.routes のルートマニフェストには、初期の SSR で必要な最小限のルートのみが含まれ、ユーザーが移動するにつれてルートが動的に追加されます。
  • Remix ハンドラには、マニフェストパッチを取得するための新しい内部 /__manifest エンドポイントが追加されました。
    • ⚠️ これは内部実装の詳細であり、アプリケーションコードから要求することを意図していません。