スペシャルファイル
React Routerは、プロジェクト内でいくつかの特別なファイルを探します。これらのファイルのすべてが必須というわけではありません。
react-router.config.ts
このファイルはオプションです
この設定ファイルは、サーバーサイドレンダリングを使用しているかどうか、特定のディレクトリがどこに配置されているかなど、アプリの特定の側面を設定するために使用されます。
詳細は、設定APIを参照してください。
root.tsx
このファイルは必須です
"ルート"ルート(app/root.tsx
)は、React Routerアプリケーションで唯一_必須_のルートです。これは、routes/
ディレクトリ内のすべてのルートの親であり、ルート<html>
ドキュメントのレンダリングを担当するためです。
ルートルートはドキュメントを管理するため、React Routerが提供するいくつかの「ドキュメントレベル」コンポーネントをレンダリングするのに適した場所です。これらのコンポーネントは、ルートルート内で一度使用され、ページが正しくレンダリングされるためにReact Routerが認識または構築したすべてのものを含みます。
Layoutエクスポート
ルートルートは、すべてのルートモジュールエクスポートをサポートしています。
ルートルートは、追加のオプションのLayout
エクスポートもサポートしています。Layout
コンポーネントは2つの目的を果たします。
- ルートコンポーネント、
HydrateFallback
、ErrorBoundary
全体でドキュメントの「アプリシェル」を複製するのを避ける - Reactが
<Links>
コンポーネントから<link rel="stylesheet">
タグを削除して再追加する場合に、Reactがアプリシェルの要素を再マウントするのを防ぎ、FOUCが発生するのを防ぎます。
Layout
コンポーネントでのuseLoaderData
に関する注意事項
useLoaderData
はErrorBoundary
コンポーネントで使用することは許可されていません。これは、ハッピーパスルートレンダリングを目的としており、その型定義には、loader
が正常に実行され、何かを返したという組み込みの仮定があるためです。loader
がスローして境界をトリガーした可能性があるため、ErrorBoundary
ではこの仮定は成り立ちません!ErrorBoundary
でローダーデータにアクセスするには、useRouteLoaderData
を使用できます。これは、ローダーデータがundefined
である可能性を考慮します。
Layout
コンポーネントは成功とエラーの両方のフローで使用されるため、同じ制限が適用されます。成功したリクエストだったかどうかによってLayout
のロジックを分岐させる必要がある場合は、useRouteLoaderData("root")
とuseRouteError()
を使用できます。
<Layout>
コンポーネントはErrorBoundary
のレンダリングに使用されるため、ErrorBoundary
をレンダリングエラーに遭遇することなくレンダリングできることを確認するために、_非常に防御的に_する必要があります。Layout
が境界をレンダリングしようとして別のエラーをスローした場合、それは使用できなくなり、UIは非常に最小限の組み込みデフォルトErrorBoundary
にフォールバックします。
routes.ts
このファイルは必須です
routes.ts
ファイルは、どのURLパターンがどのルートモジュールに一致するかを設定するために使用されます。
詳細は、ルーティングガイドを参照してください。
entry.client.tsx
このファイルはオプションです
デフォルトでは、React Routerはクライアントでのアプリのハイドレーションを処理します。次のコマンドでデフォルトのエントリクライアントファイルを公開できます。
このファイルはブラウザのエントリポイントであり、サーバーエントリモジュールでサーバーによって生成されたマークアップをハイドレートする役割を果たしますが、ここで他のクライアントサイドコードを初期化することもできます。
これはブラウザで最初に実行されるコードです。クライアント側のライブラリを初期化したり、クライアント専用のプロバイダーを追加したりできます。
entry.server.tsx
このファイルはオプションです
デフォルトでは、React RouterはHTTPレスポンスの生成を処理します。次のコマンドでデフォルトのエントリサーバーファイルを公開できます。
このモジュールのdefault
エクスポートは、HTTPステータス、ヘッダー、HTMLを含むレスポンスを作成できる関数であり、マークアップの生成とクライアントへの送信方法を完全に制御できます。
このモジュールは、現在のリクエストのcontext
とurl
を使用して<ServerRouter>
要素を使用して現在のページのマークアップをレンダリングする必要があります。このマークアップは(オプションで)、クライアントエントリモジュールを使用してJavaScriptがブラウザにロードされた後に再ハイドレートされます。
handleDataRequest
データリクエストのレスポンスを変更できるオプションのhandleDataRequest
関数をエクスポートできます。これらは、HTMLをレンダリングするのではなく、クライアント側のハイドレーションが発生した後にローダーとアクションデータをブラウザに返すリクエストです。
handleError
デフォルトでは、React Routerは発生したサーバーサイドエラーをコンソールに出力します。ロギングをより詳細に制御したい場合、またはこれらのエラーを外部サービスにも報告したい場合は、オプションのhandleError
関数をエクスポートできます。これにより、制御が可能になり(組み込みのエラーロギングは無効になります)。
リクエストが中断された場合にロギングを避けるのが一般的です。React Routerのキャンセルと競合状態の処理により、多くのリクエストが中断される可能性があるためです。
ストリーミングレンダリングエラー
renderToPipeableStream
またはrenderToReadableStream
を使用してHTMLレスポンスをストリーミングしている場合、独自のhandleError
実装は、最初のシェルレンダリング中に発生したエラーのみを処理します。後続のストリーミングレンダリング中にレンダリングエラーが発生した場合、React Routerサーバーはすでにレスポンスを送信しているため、これらのエラーを手動で処理する必要があります。
renderToPipeableStream
の場合、onError
コールバック関数でこれらのエラーを処理できます。エラーがシェルレンダリングエラー(無視できる)か非同期エラーかを判断するために、onShellReady
でブール値を切り替える必要があります。
例については、ノードのデフォルトのentry.server.tsx
を参照してください。
スローされたレスポンス
これは、loader
/action
関数からスローされたResponse
インスタンスを処理しません。このハンドラの目的は、予期しないスローされたエラーを引き起こすコードのバグを見つけることです。シナリオを検出してloader
/action
で401/404などのResponse
をスローしている場合は、コードによって処理される予期されたフローです。これらのエラーをログに記録したり、外部サービスに送信したりする必要がある場合も、レスポンスをスローした時点で実行する必要があります。