クライアントデータ
Remixはv2.4.0
で「クライアントデータ」(RFC)のサポートを導入しました。これにより、ルートからclientLoader
/clientAction
をエクスポートすることで、ブラウザでルートローダー/アクションを実行することを選択できます。
これらの新しいエクスポートは少し扱いが難しいものであり、主要なデータ読み込み/送信メカニズムとして推奨されるものではありません。代わりに、以下のような高度なユースケースに対応するためのレバーとして利用できます。
- ホップをスキップ: ブラウザから直接データAPIをクエリし、ローダーをSSRのためだけに使用する
- フルスタック状態: ローダーデータの完全なセットのために、サーバーデータをクライアントデータで補強する
- どちらか一方: サーバーローダーを使用する場合もあれば、クライアントローダーを使用する場合もあるが、1つのルートで両方を使用することはない
- クライアントキャッシュ: サーバーローダーデータをクライアントにキャッシュし、一部のサーバー呼び出しを回避する
- 移行: React Router -> Remix SPA -> Remix SSRへの移行を容易にする(RemixがSPAモードをサポートしたら)
これらの新しいエクスポートは慎重に使用してください!注意しないと、UIが同期しなくなる可能性があります。Remixは、デフォルトではこれが起こらないように非常に努力していますが、独自のクライアント側キャッシュを制御し、Remixが通常のサーバーfetch
呼び出しを実行するのを防ぐ可能性がある場合、RemixはUIが同期した状態を維持することを保証できなくなります。
ホップをスキップする
BFFアーキテクチャでRemixを使用する場合、Remixサーバーのホップをスキップして、バックエンドAPIに直接アクセスすることが有利な場合があります。これは、認証を適切に処理でき、CORSの問題に悩まされないことを前提としています。Remix BFFホップは、次のようにスキップできます。
- ドキュメントのロード時にサーバーの
loader
からデータをロードする
- 後続のすべてのロードで
clientLoader
からデータをロードする
このシナリオでは、Remixはハイドレーション時にclientLoader
を呼び出さず、後続のナビゲーションでのみ呼び出します。
フルスタックステート
場合によっては、「フルスタックステート」を活用したいことがあります。これは、データの一部がサーバーから、一部がブラウザ(つまり、IndexedDB
やその他のブラウザSDK)から取得されるものの、データの組み合わせが揃うまでコンポーネントをレンダリングできない場合です。これらの2つのデータソースを組み合わせる方法は次のとおりです。
- ドキュメントのロード時に、サーバーの
loader
から部分的なデータをロードします。
- SSR中にレンダリングするための
HydrateFallback
コンポーネントをエクスポートします。これは、まだ完全なデータセットがないためです。
clientLoader.hydrate = true
を設定します。これにより、Remixは初期ドキュメントのハイドレーションの一部としてclientLoaderを呼び出すように指示されます。
clientLoader
でサーバーデータとクライアントデータを結合します。
どちらか一方
アプリケーション内でデータ読み込み戦略を混在させたい場合があるかもしれません。例えば、一部のルートではサーバーでのみデータを読み込み、別のルートではクライアントでのみデータを読み込むようにしたい場合です。これはルートごとに次のように選択できます。
- サーバーデータを使用したい場合は
loader
をエクスポートする
- クライアントデータを使用したい場合は
clientLoader
と HydrateFallback
をエクスポートする
サーバーローダーのみに依存するルートは次のようになります。
クライアントローダーのみに依存するルートは次のようになります。
クライアントキャッシュ
クライアント側のキャッシュ(メモリ、ローカルストレージなど)を活用して、以下のようにサーバーへの特定の呼び出しをバイパスできます。
- ドキュメントのロード時にサーバーの
loader
からデータをロードします。
clientLoader.hydrate = true
を設定してキャッシュをプライムします。
- 後続のナビゲーションを
clientLoader
を介してキャッシュからロードします。
clientAction
でキャッシュを無効化します。
HydrateFallback
コンポーネントをエクスポートしていないため、ルートコンポーネントを SSR し、ハイドレーション時に clientLoader
を実行することに注意してください。したがって、ハイドレーションエラーを避けるために、初期ロード時に loader
と clientLoader
が同じデータを返すことが重要です。
マイグレーション
SPAモードが実装され次第、マイグレーションに関する個別のガイドを作成する予定ですが、現時点では、以下の様なプロセスになると予想しています。
createBrowserRouter
/RouterProvider
に移行することで、React Router SPAにデータパターンを導入する
- Remixへのマイグレーションに備えて、Viteを使用するようにSPAを移行する
- Viteプラグイン(まだ提供されていません)を使用して、ファイルベースのルート定義に段階的に移行する
- React Router SPAをRemix SPAモードに移行する。この際、現在のファイルベースの
loader
関数はすべてclientLoader
として機能する
- Remix SPAモードをオプトアウト(Remix SSRモードに移行)し、
loader
関数をclientLoader
に検索/置換する
- これでSSRアプリが実行されますが、すべてのデータローディングは
clientLoader
を介してクライアントで実行されます
clientLoader -> loader
への移行を段階的に開始し、データローディングをサーバーに移行し始める