loader
📼 Remix シングルを見る: Remix シングル プレイリスト:コンポーネントへのデータの読み込み
各ルートは、レンダリング時にルートにデータを提供するloader
関数定義できます。
この関数はサーバーでのみ実行されます。最初のサーバーレンダリング時に、HTMLドキュメントにデータを提供します。ブラウザ内のナビゲーションでは、Remixは fetch
を介してブラウザから関数を呼び出します。
これは、データベースに直接アクセスしたり、サーバー専用のAPIシークレットを使用したりできることを意味します。UIのレンダリングに使用されないコードは、ブラウザバンドルから削除されます。
データベースORMPrisma を例として使用します。
prisma
はloader
でのみ使用されるため、コンパイラによってブラウザバンドルから削除されます。これは、強調表示された行で示されています。
`loader`から返すものは何でも、コンポーネントがレンダリングしない場合でも、クライアントに公開されます。`loader`は公開APIエンドポイントと同じように注意して扱いましょう。
タイプセーフティ
useLoaderData<typeof loader>
を使用して、loader
とコンポーネント間のネットワークに対してタイプセーフティを得ることができます。
data.name
は文字列であることがわかります。
data.date
も文字列であることがわかります。これは、json
に日付オブジェクトを渡したとしても、データがクライアント遷移のために取得されると、値は JSON.stringify
を使用してネットワーク経由でシリアル化され、タイプはそのことを認識しているためです。
params
ルートパラメータは、ルートファイル名によって定義されます。セグメントが$
で始まる場合(例:$invoiceId
)、そのセグメントのURLからの値はloader
に渡されます。
パラメータは、主にIDでレコードを検索する際に役立ちます。
request
これはFetch Requestインスタンスです。MDNドキュメントを読んで、すべてのプロパティを確認できます。
loader
で最も一般的なユースケースは、ヘッダー(Cookieなど)とリクエストのURL URLSearchParams
を読み取ることです。
context
これは、サーバーアダプターの getLoadContext()
関数に渡されるコンテキストです。これは、アダプターのリクエスト/レスポンスAPIとRemixアプリ間のギャップを埋める方法です。
このAPIはエスケープハッチであり、必要になることはまれです
Expressアダプターを例として使用します。
そして、loader
はアクセスできます。
レスポンスインスタンスを返す
loader
からFetch Responseを返す必要があります。
json
ヘルパーを使用すると、これを簡素化できます。そのため、自分で構築する必要はありません。しかし、これらの2つの例は実際には同じです。
json
がどのように少しだけ作業を行い、loader
をはるかにクリーンにするかを見ることができます。json
ヘルパーを使用して、ヘッダーまたはステータスコードをレスポンスに追加することもできます。
以下も参照してください。
ローダーでレスポンスをスローする
レスポンスを返すことに加えて、loader
からResponse
オブジェクトをスローすることもできます。これにより、コールスタックを突破して、次のいずれかを実行できます。
- 別のURLにリダイレクトする
ErrorBoundary
を通じてコンテキストデータを含む代替UIを表示する
これは、ローダーでコードの実行を停止し、代替UIを表示するレスポンスをスローするユーティリティ関数をどのように作成できるかを示す完全な例です。