meta
meta
エクスポートを使用すると、アプリケーションのすべてのルートにメタデータHTMLタグを追加できます。これらのタグは、検索エンジン最適化(SEO)や、特定の動作を決定するためのブラウザディレクティブなど、重要な役割を果たします。また、ソーシャルメディアサイトがアプリのリッチプレビューを表示するためにも使用できます。
meta
関数は、MetaDescriptor
オブジェクトの配列を返す必要があります。これらのオブジェクトはHTMLタグと1対1に対応します。そのため、次のmeta
関数:
は、次のHTMLを生成します。
デフォルトでは、メタ記述子はほとんどの場合、<meta>
タグをレンダリングします。2つの例外は次のとおりです。
{ title }
は<title>
タグをレンダリングします。{ "script:ld+json" }
は<script type="application/ld+json">
タグをレンダリングし、その値はシリアライズ可能なオブジェクトである必要があります。オブジェクトは文字列化され、タグに挿入されます。
メタ記述子は、tagName
プロパティを"link"
に設定することで、<link>
タグをレンダリングすることもできます。これは、canonical
URLなどのSEOに関連する<link>
タグに役立ちます。スタイルシートやファビコンなどのアセットリンクについては、links
エクスポートを使用する必要があります。
meta
関数の引数
location
これは現在のルーターLocation
オブジェクトです。これは、特定のパスまたはクエリパラメータのルートのタグを生成するのに役立ちます。
matches
これは、現在のルートのマッチングの配列です。多くの情報にアクセスできますが、特に親のマッチングからメタデータとデータにアクセスできます。
matches
のインターフェースはuseMatches
の戻り値に似ていますが、各マッチングにはそのmeta
関数の出力が含まれます。これは、ルート階層全体でメタデータをマージするのに役立ちます。
data
これは、ルートのloader
からのデータです。
params
ルートのURLパラメータです。ルーティングガイドの動的セグメントを参照してください。
error
エラー境界をトリガーするスローされたエラーは、meta
関数に渡されます。これは、エラーページのメタデータを生成するのに役立ちます。
親ルートのローダーからデータにアクセスする
現在のルートのデータに加えて、多くの場合、ルート階層の上位のルートのデータにアクセスしたいことがあります。matches
でルートIDを検索して、データにアクセスできます。
meta
とネストされたルートに関する注意点
複数のネストされたルートが同時にレンダリングされるため、最終的にレンダリングされるメタタグを決定するために、マージする必要があります。Remixでは、明らかなデフォルトがないため、このマージを完全に制御できます。
Remixは、メタエクスポートを持つ最後のマッチングルートを使用します。これにより、title
をオーバーライドしたり、親ルートが追加したog:image
のようなものを削除したり、親のすべてを保持して子ルートに新しいメタを追加したりできます。
これは、初心者にとってはかなり難しい場合があります。
/projects/123
のようなルートを考えてみましょう。このルートには、app/root.tsx
、app/routes/projects.tsx
、app/routes/projects.$id.tsx
という3つのマッチングルートがある可能性があります。これら3つのルートはすべて、メタ記述子をエクスポートしている可能性があります。
このコードでは、/projects
と/projects/123
ではviewport
メタタグが失われます。これは、最後のメタのみが使用され、コードが親とマージされないためです。
meta
グローバルほとんどのアプリケーションでは、viewport
やcharSet
のようなグローバルメタを使用します。meta
エクスポートではなく、ルートルート内の通常の<meta>
タグを使用することをお勧めします。これにより、マージする必要がなくなり、処理が簡単になります。
meta
の回避
親ルートでの親ルートからオーバーライドする必要があるmeta
をエクスポートしないことで、マージの問題を回避することもできます。親ルートにmeta
を定義するのではなく、インデックスルートを使用します。これにより、タイトルなどの複雑なマージロジックを回避できます。そうでなければ、親のタイトル記述子を検索して、子のタイトルに置き換える必要があります。インデックスルートを使用すれば、オーバーライドする必要がなくなり、はるかに簡単になります。
meta
とのマージ
親通常は、親がすでに定義しているmeta
にmeta
を追加するだけです。スプレッド演算子とmatches
引数を使用して、親meta
をマージできます。
ただし、title
のようなものをオーバーライドすることはできません。これは単に追加するだけです。継承されたルートのメタにtitle
タグが含まれている場合は、Array.prototype.filter
を使用してオーバーライドできます。
meta
マージヘルパー
グローバルメタまたはインデックスルートを使用してマージの問題を回避できない場合は、親メタを簡単にオーバーライドして追加できるヘルパーをアプリケーションに置くことができます。