layout.tsxやpage.tsxからmetadataオブジェクトをexportすることで、<head>内のタイトルやOGP等を型安全に設定できる。
// ── 静的なメタデータ: layout.tsx や page.tsx から export ─
import type { Metadata } from 'next';
// metadata オブジェクトを export するだけでOK
export const metadata: Metadata = {
// ブラウザのタブタイトル
title: {
default: 'My App', // トップページのタイトル
template: '%s | My App', // 子ページ: "ページ名 | My App"
},
description: 'アプリの説明文(検索結果に表示される)',
// OGP(SNSシェア時のプレビュー)
openGraph: {
title: 'My App',
description: 'OGP用の説明文',
images: ['/og-image.png'], // シェア時のサムネイル画像
},
// Twitterカード
twitter: { card: 'summary_large_image' },
};
// ── 動的なメタデータ: ページのデータに基づいて生成 ──────
// generateMetadata 関数を export する
export async function generateMetadata({
params,
}: {
params: Promise<{ slug: string }>;
}): Promise<Metadata> {
const { slug } = await params;
// DBやAPIから記事データを取得
const post = await fetchPost(slug);
return {
title: post.title, // 記事タイトルをページタイトルに
description: post.excerpt, // 記事の抜粋を説明文に
openGraph: {
title: post.title,
images: [post.coverImage], // 記事のOGP画像
},
};
}metadataオブジェクトはサーバー側でのみ使える。Client Componentからはメタデータを直接設定できない。