メタデータ
Next.js には メタデータ API があり、アプリケーションのメタデータ(HTML head
要素内のmeta
タグやlink
タグなど)を定義して、SEOやウェブ共有性を向上させることができます。
アプリケーションにメタデータを追加する方法は2つあります:
- 設定ベースメタデータ: 静的なメタデータオブジェクトまたは動的な generateMetadata 関数を
layout.js
またはpage.js
ファイルにエクスポートします。 - ファイルベースのメタデータ: ルートセグメントに静的または動的に生成された特殊ファイルを追加します。
これらのオプションを使用すると、Next.js はページの関連する <head>
要素を自動的に生成します。
また、ImageResponse
コンストラクタを使って動的な OG 画像を作成することもできます。
静的メタデータ
静的メタデータを定義するには、layout.js
または 静的な page.js
ファイルから メタデータオブジェクトをエクスポートします。
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: '...',
description: '...',
}
export default function Page() {}
利用可能なすべてのオプションについては、API リファレンスを参照してください。
動的メタデータ
generateMetadata
関数を使用すると、動的な値を必要とするメタデータを fetch
できます。
import type { Metadata, ResolvingMetadata } from 'next'
type Props = {
params: { id: string }
searchParams: { [key: string]: string | string[] | undefined }
}
export async function generateMetadata(
{ params, searchParams }: Props,
parent: ResolvingMetadata
): Promise<Metadata> {
// read route params
const id = params.id
// fetch data
const product = await fetch(`https://.../${id}`).then((res) => res.json())
// optionally access and extend (rather than replace) parent metadata
const previousImages = (await parent).openGraph?.images || []
return {
title: product.title,
openGraph: {
images: ['/some-specific-page-image.jpg', ...previousImages],
},
}
}
export default function Page({ params, searchParams }: Props) {}
利用可能なすべてのパラメータについては、API リファレンスを参照してください。
Good to know:
generateMetadata
による静的および動的メタデータは、Server Components でのみ サポートされます。fetch
リクエストは、generateMetadata
、generateStaticParams
、Layouts、Pages、および Server Components 全体で同じデータに対して自動的にメモされます。fetch
が利用できない場合は、React キャッシュを使用できます。- Next.js は、
generateMetadata
内のデータ取得が完了するまで待ってから、UIをクライアントにストリーミングします。これにより、ストリームされたレスポンスの最初の部分に<head>
タグが含まれることが保証されます。
ファイルベースのメタデータ
これらの特別なファイルはメタデータに利用することができます:
- favicon.ico, apple-icon.jpg, and icon.jpg
- opengraph-image.jpg and twitter-image.jpg
- robots.txt
- sitemap.xml
これらのファイルは静的なメタデータとして使用することもでき、コードを使ってプログラムで生成することもできます。
実装と例については、メタデータファイル API リファレンス と 動的な画像生成 を参照してください。
Behavior
ファイルベースのメタデータの方が優先順位が高く、設定ベースのメタデータよりも優先されます。
デフォルトフィールド
ルートがメタデータを定義していない場合でも、常に追加されるデフォルトの meta
タグが 2 つあります:
- meta charset タグは、ウェブサイトの文字エンコーディングを設定します。
- meta viewport タグは、ウェブサイト のビューポート幅とスケールを設定し、異なるデバイス用に調整します。
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
Good to know: デフォルトの
viewport
meta タグを上書きすることができます。
順序
メタデータは、ルートセグメントから最後の page.js
セグメントに最も近いセグメントまで、順番に評価されます。例えば以下の通りです。
app/layout.tsx
(ルートレイアウト)app/blog/layout.tsx
(ネストされたブログレイアウト)app/blog/[slug]/page.tsx
(ブログページ)
マージ
評価順序に従って、同じルート内の複数のセグメントからエクスポートされたメタデータオブジェクトが 浅く マージされ、ルートの最終的なメタデータ出力が形成されます。重複するキーは、その順序に基づいて 置き換えられます。
つまり、以前のセグメントで定義された openGraph
や robots
のようなネストしたフィールドを持つメタデータは、それらを定義した最後のセグメントによって 上書き されます。
フィールドの上書き
export const metadata = {
title: 'Acme',
openGraph: {
title: 'Acme',
description: 'Acme is a...',
},
}
export const metadata = {
title: 'Blog',
openGraph: {
title: 'Blog',
},
}
// Output:
// <title>Blog</title>
// <meta property="og:title" content="Blog" />