メタデータを追加し、OG画像を作成する方法
メタデータAPIは、SEOとウェブ共有性を向上させるために、アプリケーションのメタデータを定義するために使用でき、以下が含まれます。
- 静的な
metadata
オブジェクト - 動的な
generateMetadata
関数 - 静的または動的に生成されたファビコンやOG画像を追加するために使用できる特別なファイル規約。
上記のすべてのオプションを使用すると、Next.jsはページに関連する<head>
タグを自動的に生成し、それらはブラウザの開発者ツールで検査できます。
デフォルトフィールド
ルートがメタデータを定義していない場合でも、常に2つのデフォルトのmeta
タグが追加されます
- meta charset タグは、ウェブサイトの文字エンコーディングを設定します。
- meta viewport タグは、さまざまなデバイスに合わせてウェブサイトのビューポートの幅とスケールを設定します。
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
その他のメタデータフィールドは、Metadata
オブジェクト(静的メタデータ用)または generateMetadata
関数(生成されたメタデータ用)で定義できます。
静的メタデータ
静的メタデータを定義するには、静的なlayout.js
またはpage.js
ファイルからMetadata
オブジェクトをエクスポートします。例えば、ブログルートにタイトルと説明を追加するには
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: 'My Blog',
description: '...',
}
export default function Page() {}
利用可能なオプションの全リストは、メタデータ生成のドキュメントで確認できます。
生成されたメタデータ
データに依存するメタデータをfetch
するには、generateMetadata
関数を使用できます。例えば、特定のブログ記事のタイトルと説明をフェッチするには
import type { Metadata, ResolvingMetadata } from 'next'
type Props = {
params: Promise<{ id: string }>
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}
export async function generateMetadata(
{ params, searchParams }: Props,
parent: ResolvingMetadata
): Promise<Metadata> {
const slug = (await params).slug
// fetch post information
const post = await fetch(`https://api.vercel.app/blog/${slug}`).then((res) =>
res.json()
)
return {
title: post.title,
description: post.description,
}
}
export default function Page({ params, searchParams }: Props) {}
舞台裏では、Next.jsはUIとは別にメタデータをストリームし、解決され次第そのメタデータをHTMLに注入します。
データリクエストのメモ化
メタデータとページ自体の両方に同じデータをフェッチする必要がある場合があります。重複するリクエストを避けるため、Reactのcache
関数を使用して戻り値をメモ化し、データを一度だけフェッチできます。例えば、メタデータとページの両方に対してブログ記事情報をフェッチするには
import { cache } from 'react'
import { db } from '@/app/lib/db'
// getPost will be used twice, but execute only once
export const getPost = cache(async (slug: string) => {
const res = await db.query.posts.findFirst({ where: eq(posts.slug, slug) })
return res
})
import { getPost } from '@/app/lib/data'
export async function generateMetadata({
params,
}: {
params: { slug: string }
}) {
const post = await getPost(params.slug)
return {
title: post.title,
description: post.description,
}
}
export default async function Page({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug)
return <div>{post.title}</div>
}
ファビコン
ファビコンは、ブックマークや検索結果でサイトを表す小さなアイコンです。アプリケーションにファビコンを追加するには、favicon.ico
を作成し、appフォルダのルートに追加します。

コードを使用してファビコンをプログラムで生成することもできます。詳細については、ファビコンドキュメントを参照してください。
静的Open Graph画像
Open Graph (OG) 画像は、ソーシャルメディアでサイトを表す画像です。アプリケーションに静的なOG画像を追加するには、appフォルダのルートに opengraph-image.png
ファイルを作成します。

フォルダ構造のさらに深い場所に opengraph-image.png
を作成することで、特定のルートのOG画像を追加することもできます。例えば、/blog
ルートに特化したOG画像を作成するには、blog
フォルダ内に opengraph-image.jpg
ファイルを追加します。

より具体的な画像は、フォルダ構造内でそれより上位にあるOG画像よりも優先されます。
jpeg
、png
、webp
などの他の画像形式もサポートされています。詳細については、Open Graph Imageのドキュメントを参照してください。
生成されたOpen Graph画像
ImageResponse
コンストラクターを使用すると、JSXとCSSを使用して動的な画像を生成できます。これはデータに依存するOG画像に役立ちます。
例えば、各ブログ記事に対して一意のOG画像を生成するには、blog
フォルダ内に opengraph-image.ts
ファイルを追加し、next/og
から ImageResponse
コンストラクターをインポートします。
import { ImageResponse } from 'next/og'
import { getPost } from '@/app/lib/data'
// Image metadata
export const size = {
width: 1200,
height: 630,
}
export const contentType = 'image/png'
// Image generation
export default async function Image({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug)
return new ImageResponse(
(
// ImageResponse JSX element
<div
style={{
fontSize: 128,
background: 'white',
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
{post.title}
</div>
)
)
}
ImageResponse
は、flexbox や絶対位置指定、カスタムフォント、テキスト折り返し、中央揃え、ネストされた画像など、一般的なCSSプロパティをサポートしています。サポートされているCSSプロパティの全リストを参照してください。
参考情報:
- 例は、Vercel OG Playgroundで利用できます。
ImageResponse
は、HTMLとCSSをPNGに変換するために、@vercel/og、Satori、および Resvg を使用しています。- flexboxと一部のCSSプロパティのみがサポートされています。高度なレイアウト(例:
display: grid
)は動作しません。
API リファレンス
generateMetadata
Metadata Files
favicon, icon, and apple-icon
opengraph-image and twitter-image
ImageResponse
このページは役に立ちましたか?