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