サーバーとクライアントでのコード実行
Remix は、サーバーとブラウザの両方でアプリを実行します。ただし、すべてのコードが両方で実行されるわけではありません。
ビルドステップ中に、コンパイラーはサーバービルドとクライアントビルドの両方を作成します。サーバービルドはすべてを単一のモジュール(またはサーバーバンドルを使用する場合は複数のモジュール)にバンドルしますが、クライアントビルドはブラウザでの読み込みを最適化するためにアプリを複数のバンドルに分割します。また、バンドルからサーバーコードを削除します。
次のルートのエクスポートと、それらの中で使用される依存関係は、クライアントビルドから削除されます。
前のセクションのこのルートモジュールを考えてみましょう。
サーバービルドには、最終的なバンドルにモジュール全体が含まれます。ただし、クライアントビルドは、action
、headers
、および loader
を、依存関係とともに削除し、次のようになります。
クライアントとサーバーのコードの分割
デフォルトでは、Vite はサーバー専用コードとクライアントセーフコードを同じモジュールに混在させることをサポートしていません。
Remix は、どのエクスポートがサーバー専用であるかを知っており、クライアントからそれらを削除できるため、ルートに対して例外を設けることができます。
Remix でサーバー専用コードを分離する方法はいくつかあります。
最も簡単な方法は、.server
および .client
モジュールを使用することです。
.server
モジュール
厳密には必須ではありませんが、.server
モジュール は、モジュール全体をサーバー専用として明示的にマークするのに適した方法です。
.server
ファイルまたは .server
ディレクトリ内のコードが誤ってクライアントモジュールグラフに含まれると、ビルドは失敗します。
.server
モジュールは、Remix アプリケーションディレクトリ内にある必要があります。
.server
ディレクトリは、Remix Vite を使用する場合にのみサポートされます。Classic Remix Compiler は、.server
ファイルのみをサポートします。
.client
モジュール
サーバーでバンドルすることさえ安全ではないクライアントライブラリに依存している場合があります。たとえば、インポートされるだけで window
にアクセスしようとする場合などです。
ファイル名に *.client.ts
を追加するか、.client
ディレクトリ内にネストすることで、これらのモジュールの内容をサーバービルドから削除できます。
.client
ディレクトリは、Remix Vite を使用する場合にのみサポートされます。Classic Remix Compiler は、.client
ファイルのみをサポートします。
vite-env-only
サーバー専用コードとクライアントセーフコードを同じモジュールに混在させたい場合は、
vite-env-only を使用できます。
この Vite プラグインを使用すると、任意の式をサーバー専用として明示的にマークして、クライアントで undefined
に置き換えることができます。
たとえば、プラグインを Vite 設定 に追加したら、サーバー専用のエクスポートを serverOnly$
でラップできます。
この例は、クライアント用に次のコードにコンパイルされます。