loader
📼 Remix Single をご覧下さい: Remix Single: コンポーネントへのデータの読み込み
各ルートは、レンダリング時にルートにデータを提供する loader
関数を定義できます。
この関数は、サーバーでのみ実行されます。最初のサーバーレンダリング時に、HTMLドキュメントにデータを提供します。ブラウザでのナビゲーション時に、Remixはブラウザからfetch
を介して関数を呼び出します。
つまり、データベースに直接アクセスしたり、サーバー専用のAPIシークレットを使用したりすることができます。UIのレンダリングに使用されないコードはすべて、ブラウザバンドルから削除されます。
データベースORM Prismaを例として使用します。
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 でのレスポンスの投げ込み
レスポンスを返すことに加えて、loader
から Response
オブジェクトをスローすることもできます。これにより、コールスタックを突破して、次のいずれかを行うことができます。
- 別のURLにリダイレクトする
ErrorBoundary
を介してコンテキストデータを含む代替UIを表示する
以下は、ローダーでのコードの実行を停止し、代替UIを表示するためにレスポンスをスローするユーティリティ関数の作成方法を示す完全な例です。