layout.tsxやpage.tsxからmetadataオブジェクトをexportすることで、<head>内のタイトルやOGP等を型安全に設定できる。
// app/layout.tsx — 静的メタデータ
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: {
default: 'My App',
template: '%s | My App', // 子ページ: "記事タイトル | My App"
},
description: 'アプリの説明',
openGraph: {
title: 'My App',
description: 'OGP説明',
images: ['/og-image.png'],
},
twitter: { card: 'summary_large_image' },
};
// app/blog/[slug]/page.tsx — 動的メタデータ
export async function generateMetadata({
params,
}: {
params: Promise<{ slug: string }>;
}): Promise<Metadata> {
const { slug } = await params;
const post = await getPost(slug);
return {
title: post.title,
description: post.excerpt,
openGraph: {
images: [post.coverImage],
},
};
}metadataオブジェクトはサーバー側でのみ使える。Client Componentからはメタデータを直接設定できない。