generateMetadata
メタデータを定義するには、metadata
オブジェクトまたはgenerateMetadata
関数を使用できます。
metadata
オブジェクト
静的メタデータを定義するには、layout.js
またはpage.js
ファイルからMetadata
オブジェクトをエクスポートします。
サポートされているオプションの完全なリストについては、メタデータフィールドを参照してください。
generateMetadata
関数
動的な情報(現在のルートパラメータ、外部データ、または親セグメントのmetadata
など)に依存する動的メタデータは、Metadata
オブジェクトを返すgenerateMetadata
関数をエクスポートすることで設定できます。
知っておくと便利:
- メタデータは
layout.js
とpage.js
ファイルに追加できます。- Next.jsは自動的にメタデータを解決し、ページに関連する
<head>
タグを作成します。metadata
オブジェクトとgenerateMetadata
関数のエクスポートはサーバーコンポーネントでのみサポートされています。- 同じルートセグメントから
metadata
オブジェクトとgenerateMetadata
関数の両方をエクスポートすることはできません。generateMetadata
内のfetch
リクエストは、generateMetadata
、generateStaticParams
、レイアウト、ページ、サーバーコンポーネント間で同じデータに対して自動的にメモ化されます。fetch
が利用できない場合、Reactのcache
を使用できます。- ファイルベースのメタデータは優先度が高く、
metadata
オブジェクトとgenerateMetadata
関数を上書きします。
リファレンス
パラメータ
generateMetadata
関数は以下のパラメータを受け取ります:
-
props
- 現在のルートのパラメータを含むオブジェクト:-
params
-generateMetadata
が呼び出されたセグメントまでの動的ルートパラメータオブジェクトを含むオブジェクト。例:ルート URL params
app/shop/[slug]/page.js
/shop/1
{ slug: '1' }
app/shop/[tag]/[item]/page.js
/shop/1/2
{ tag: '1', item: '2' }
app/shop/[...slug]/page.js
/shop/1/2
{ slug: ['1', '2'] }
-
searchParams
- 現在のURLの検索パラメータを含むオブジェクト。例:URL searchParams
/shop?a=1
{ a: '1' }
/shop?a=1&b=2
{ a: '1', b: '2' }
/shop?a=1&a=2
{ a: ['1', '2'] }
-
-
parent
- 親ルートセグメントから解決されたメタデータのPromise。
戻り値
generateMetadata
は、1つ以上のメタデータフィールドを含むMetadata
オブジェクトを返す必要があります。
知っておくと便利:
- メタデータがランタイム情報に依存しない場合は、
generateMetadata
ではなく静的metadata
オブジェクトを使用して定義する必要があります。fetch
リクエストは、generateMetadata
、generateStaticParams
、レイアウト、ページ、サーバーコンポーネント間で同じデータに対して自動的にメモ化されます。fetch
が利用できない場合、Reactのcache
を使用できます。searchParams
はpage.js
セグメントでのみ利用可能です。- Next.jsの
redirect()
およびnotFound()
メソッドもgenerateMetadata
内で使用できます。
メタデータフィールド
以下のフィールドがサポートされています:
title
title
属性はドキュメントのタイトルを設定するために使用されます。文字列またはオプションのテンプレートオブジェクトとして定義できます。
文字列
default
title.default
は、title
を定義していない子ルートセグメントにフォールバックタイトルを提供するために使用できます。
template
title.template
は、子ルートセグメントで定義されたtitles
にプレフィックスまたはサフィックスを追加するために使用できます。
知っておくと便利:
title.template
は子ルートセグメントに適用され、定義されたセグメント自体には適用されません。つまり:
title.template
を追加する場合、title.default
は必須です。layout.js
で定義されたtitle.template
は、同じルートセグメントのpage.js
で定義されたtitle
には適用されません。page.js
で定義されたtitle.template
は効果がありません。ページは常に終端セグメントであるため(子ルートセグメントを持たない)。ルートが
title
またはtitle.default
を定義していない場合、title.template
は効果がありません。
absolute
title.absolute
は、親セグメントで設定されたtitle.template
を無視するタイトルを提供するために使用できます。
知っておくと便利:
layout.js
title
(文字列)とtitle.default
は、独自のtitle
を定義していない子セグメントのデフォルトタイトルを定義します。存在する場合、最も近い親セグメントのtitle.template
を拡張します。title.absolute
は子セグメントのデフォルトタイトルを定義します。親セグメントのtitle.template
を無視します。title.template
は子セグメントの新しいタイトルテンプレートを定義します。
page.js
- ページが独自のタイトルを定義していない場合、最も近い親の解決済みタイトルが使用されます。
title
(文字列)はルートのタイトルを定義します。存在する場合、最も近い親セグメントのtitle.template
を拡張します。title.absolute
はルートタイトルを定義します。親セグメントのtitle.template
を無視します。title.template
はpage.js
では効果がありません。ページは常にルートの終端セグメントであるため。
description
その他のフィールド
metadataBase
metadataBase
は、完全修飾URLを必要とするmetadata
フィールドにベースURLプレフィックスを設定する便利なオプションです。
metadataBase
により、現在のルートセグメント以下で定義されたURLベースのmetadata
フィールドで、絶対URLではなく相対パスを使用できます。- フィールドの相対パスは
metadataBase
と組み合わされて完全修飾URLを形成します。
知っておくと便利:
metadataBase
は通常、すべてのルートにわたるURLベースのmetadata
フィールドに適用するためにルートapp/layout.js
で設定されます。- 絶対URLを必要とするすべてのURLベースの
metadata
フィールドは、metadataBase
オプションで設定できます。metadataBase
にはサブドメイン(例:https://app.acme.com
)またはベースパス(例:https://acme.com/start/from/here
)を含めることができます。metadata
フィールドが絶対URLを提供する場合、metadataBase
は無視されます。metadataBase
を設定せずにURLベースのmetadata
フィールドで相対パスを使用すると、ビルドエラーが発生します。- Next.jsは、
metadataBase
(例:https://acme.com/
)と相対フィールド(例:/path
)間の重複するスラッシュを単一のスラッシュ(例:https://acme.com/path
)に正規化します。
URL構成
URL構成は、デフォルトのディレクトリトラバーサルセマンティクスよりも開発者の意図を優先します。
metadataBase
とmetadata
フィールド間の末尾のスラッシュは正規化されます。metadata
フィールドの「絶対」パス(通常はURLパス全体を置き換える)は、「相対」パス(metadataBase
の末尾から開始)として扱われます。
例えば、以下のmetadataBase
がある場合:
上記のmetadataBase
を継承し、独自の値を設定するmetadata
フィールドは次のように解決されます:
metadata フィールド | 解決されたURL |
---|---|
/ | https://acme.com |
./ | https://acme.com |
payments | https://acme.com/payments |
/payments | https://acme.com/payments |
./payments | https://acme.com/payments |
../payments | https://acme.com/payments |
https://beta.acme.com/payments | https://beta.acme.com/payments |
openGraph
知っておくと便利:
- Open Graph画像にはファイルベースのMetadata APIを使用すると便利です。設定エクスポートと実際のファイルを同期させる必要がなく、ファイルベースのAPIが自動的に正しいメタデータを生成します。
robots
icons
知っておくと便利: アイコンには可能な限りファイルベースのMetadata APIを使用することを推奨します。設定エクスポートと実際のファイルを同期させる必要がなく、ファイルベースのAPIが自動的に正しいメタデータを生成します。
知っておくと便利:
msapplication-*
メタタグはMicrosoft EdgeのChromiumビルドではサポートされなくなったため、もはや必要ありません。
themeColor
非推奨:
metadata
内のthemeColor
オプションはNext.js 14以降非推奨です。代わりにviewport
設定を使用してください。
colorScheme
非推奨:
metadata
内のcolorScheme
オプションはNext.js 14以降非推奨です。代わりにviewport
設定を使用してください。
manifest
Web Application Manifest仕様で定義されているウェブアプリケーションマニフェスト。
twitter
Twitter仕様は(驚くべきことに)X(旧Twitter)以外でも使用されます。
Twitter Cardマークアップリファレンスの詳細をご覧ください。
viewport
非推奨:
metadata
内のviewport
オプションはNext.js 14以降非推奨です。代わりにviewport
設定を使用してください。
verification
appleWebApp
alternates
appLinks
archives
歴史的な価値のある記録、文書、その他の資料のコレクションを記述します(出典)。
assets
bookmarks
category
facebook
特定のFacebook Social PluginsのためにFacebookアプリやFacebookアカウントをウェブページに接続できますFacebookドキュメント
知っておくと便利: appIdまたはadminsのどちらかを指定できますが、両方は指定できません。
複数のfb:adminsメタタグを生成したい場合は配列値を使用できます。
pinterest
ウェブページでPinterest Rich Pinsを有効または無効にできます。
other
すべてのメタデータオプションは組み込みサポートでカバーされるべきですが、サイト固有のカスタムメタデータタグや新しくリリースされたメタデータタグがあるかもしれません。other
オプションを使用して任意のカスタムメタデータタグをレンダリングできます。
同じキーのメタタグを複数生成したい場合は配列値を使用できます。
未サポートのメタデータ
以下のメタデータタイプは現在組み込みサポートがありません。ただし、レイアウトやページ内で直接レンダリングすることは可能です。
タイプ
メタデータに型安全性を追加するには、Metadata
タイプを使用します。組み込みのTypeScriptプラグインをIDEで使用している場合、手動でタイプを追加する必要はありませんが、必要に応じて明示的に追加することもできます。
metadata
オブジェクト
generateMetadata
関数
通常の関数
非同期関数
セグメントプロパティを使用
親メタデータを使用
JavaScriptプロジェクト
JavaScriptプロジェクトでは、JSDocを使用して型安全性を追加できます。
メタデータ | 推奨方法 |
---|---|
<meta http-equiv="..."> | redirect() 、ミドルウェア、セキュリティヘッダーを使用して適切なHTTPヘッダーを設定 |
<base> | レイアウトまたはページ自体でタグをレンダリング |
<noscript> | レイアウトまたはページ自体でタグをレンダリング |
<style> | Next.jsでのスタイリングを参照 |
<script> | スクリプトの使用を参照 |
<link rel="stylesheet" /> | レイアウトまたはページで直接スタイルシートをimport |
<link rel="preload /> | ReactDOM preloadメソッドを使用 |
<link rel="preconnect" /> | ReactDOM preconnectメソッドを使用 |
<link rel="dns-prefetch" /> | ReactDOM prefetchDNSメソッドを使用 |
リソースヒント
<link>
要素には、外部リソースが必要になる可能性があることをブラウザにヒントするためのrel
キーワードがいくつかあります。ブラウザはこの情報を使用して、キーワードに応じてプリロード最適化を適用します。
メタデータAPIはこれらのヒントを直接サポートしていませんが、新しいReactDOM
メソッドを使用してドキュメントの<head>
に安全に挿入できます。
<link rel="preload">
ページレンダリング(ブラウザ)ライフサイクルの早い段階でリソースの読み込みを開始します。MDNドキュメント。
<link rel="preconnect">
オリジンへの接続を事前に開始します。MDNドキュメント。
<link rel="dns-prefetch">
リソースが要求される前にドメイン名の解決を試みます。MDNドキュメント。
知っておくと良いこと:
- これらのメソッドは現在、クライアントコンポーネントでのみサポートされており、初期ページロード時にはサーバーサイドレンダリングされます。
next/font
、next/image
、next/script
などのNext.js組み込み機能は、関連するリソースヒントを自動的に処理します。
動作
デフォルトフィールド
ルートがメタデータを定義していなくても、常に追加される2つのデフォルトのmeta
タグがあります:
- meta charsetタグはウェブサイトの文字エンコーディングを設定します。
- meta viewportタグは、異なるデバイスに合わせてウェブサイトのビューポート幅とスケールを設定します。
知っておくと良いこと: デフォルトの
viewport
メタタグを上書きできます。
メタデータのストリーミング
generateMetadata
によって返されるメタデータはクライアントにストリーミングされます。これにより、Next.jsはメタデータが解決され次第、HTMLにメタデータを注入できます。
ページメタデータは主にボットやクローラーを対象としているため、Next.jsはJavaScriptを実行し、完全なページDOMを検査できるボット(例: Googlebot
)に対してメタデータをストリーミングします。ただし、HTML制限のあるボット(例: Twitterbot
)に対しては、これらのボットがクロール中にJavaScriptを実行できないため、メタデータのレンダリングをブロックし続けます。
Next.jsは、受信リクエストのユーザーエージェントを自動的に検出し、ストリーミングメタデータを提供するか、フォールバックとしてブロッキングメタデータを提供するかを決定します。
このリストをカスタマイズする必要がある場合は、next.config.js
でhtmlLimitedBots
オプションを使用して手動で定義できます。Next.jsは、この正規表現に一致するユーザーエージェントがウェブページをリクエストしたときにブロッキングメタデータを受け取るようにします。
htmlLimitedBots
設定を指定すると、Next.jsのデフォルトリストが上書きされ、この動作を選択するユーザーエージェントを完全に制御できます。これは高度な動作であり、ほとんどの場合、デフォルトで十分です。
順序
メタデータは、ルートセグメントから始まり、最終的なpage.js
セグメントに最も近いセグメントまで順番に評価されます。例えば:
app/layout.tsx
(ルートレイアウト)app/blog/layout.tsx
(ネストされたブログレイアウト)app/blog/[slug]/page.tsx
(ブログページ)
マージ
評価順序に従って、同じルートの複数のセグメントからエクスポートされたメタデータオブジェクトは、ルートの最終的なメタデータ出力を形成するために浅くマージされます。重複するキーは、順序に基づいて置換されます。
これは、openGraph
やrobots
などのネストされたフィールドを持つメタデータが、前のセグメントで定義されている場合、それらを定義する最後のセグメントによって上書きされることを意味します。
フィールドの上書き
上記の例では:
app/layout.js
のtitle
はapp/blog/page.js
のtitle
によって置換されます。app/blog/page.js
がopenGraph
メタデータを設定しているため、app/layout.js
のすべてのopenGraph
フィールドがapp/blog/page.js
で置換されます。openGraph.description
が存在しないことに注意してください。
セグメント間で一部のネストされたフィールドを共有しながら他のフィールドを上書きしたい場合は、それらを別の変数に抽出できます:
上記の例では、OG画像はapp/layout.js
とapp/about/page.js
間で共有され、タイトルは異なります。
フィールドの継承
注記
app/layout.js
のtitle
はapp/about/page.js
のtitle
によって置換されます。app/about/page.js
がopenGraph
メタデータを設定していないため、app/layout.js
のすべてのopenGraph
フィールドがapp/about/page.js
で継承されます。
バージョン履歴
バージョン | 変更点 |
---|---|
v15.2.0 | generateMetadata へのストリーミングサポートを導入 |
v13.2.0 | viewport 、themeColor 、colorScheme が非推奨になり、viewport 設定が推奨されるようになりました |
v13.2.0 | metadata とgenerateMetadata が導入されました |