og-images について
Next.js で `next/og` と `ImageResponse` を使い、OpenGraph 画像や Twitter 画像を生成するスキルです。ソーシャル共有カードを作る開発者向けに、ファイルベースと API ルートの方法を説明します。
主な機能
- 01ファイルベースと API ルートの構成
- 02OpenGraph と Twitter の画像サイズ
- 03動的タイトルとメタデータの連携
- 04レイアウト、フォント、任意のブランド要素
- 05Satori のスタイル要件
活用シーン
- 01静的ページの共有カード生成
- 02CMS コンテンツ用画像の作成
- 03メタデータによるソーシャル画像設定
- 04開発中の画像ルートのプレビュー
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ richtabor/ agent-skills --skill og-imagesインストール後、Claude Code で/og-imagesを入力して読み込まれたか確認します。
詳細
Next.js 向けシェア画像の作成
next/og の ImageResponse を使って、動的な OpenGraph(1200x630)画像と Twitter(1200x600)画像を生成します。
アプローチの選択
- ファイルベースのルート(
app/opengraph-image.tsx):ビルド時にタイトルが決まっている静的ページに最適です。runtime、alt、size、contentTypeと、デフォルトのImage関数をエクスポートします。 - API ルート(
app/api/og/route.tsx):動的コンテンツ(ブログ記事、CMS)に最適です。クエリパラメーターとしてslugやtitleを受け取ります。generateMetadata()から参照します。
どちらのアプローチでも export const runtime = "edge" を使用します。
ファイル名の規則
| ファイル | 用途 | サイズ |
|---|---|---|
opengraph-image.tsx | Facebook、LinkedIn、iMessage | 1200x630 |
twitter-image.tsx | Twitter/X カード | 1200x600 |
app/api/og/route.tsx | 動的 API ルート | 1200x630 |
ファイルベースのルートは、該当するルートディレクトリに配置します(例:/about の場合は app/about/opengraph-image.tsx)。
レイアウトのパターン
flexDirection: "column"とjustifyContent: "space-between"を使って、コンテンツとブランド要素を分けます- タイトルとサブタイトル(例:著者名)は、左上に縦方向に並べたフレックス列として配置します
- タイトル:大きく、太字または中程度のウェイトで、暗い色にします
- サブタイトル:同じサイズか小さめにし、ウェイトを軽くして、控えめな色(例:
#888)にします textWrap: "balance"でテキストを左揃えにし、maxWidthで幅を制限します- 大きなサイズで引き締まったエディトリアルな印象にするには、
letterSpacing: "-0.02em"を使います - パディング:1200x630 では、すべての辺を
48pxにするとうまくいきます
アバター/ロゴ(任意)
プロジェクトにアバターやロゴがある場合は、justifyContent: "flex-end" を指定したフレックスコンテナーを使い、右下隅に配置します。画像は fetch と arrayBuffer で読み込み、base64 データ URI に変換して src に設定します。円形のアバターには borderRadius: "50%" を使います。読み込んだアセットは Map にキャッシュし、再取得を防ぎます。
カスタムフォント
public/fonts/ の .ttf ファイルを new URL("../../../public/fonts/YourFont.ttf", import.meta.url) で読み込みます。ArrayBuffer を fonts オプション経由で ImageResponse に渡します。フォントバッファーは初回読み込み後にキャッシュします。フォント設定の weight は、実際のフォントファイルのウェイトに合わせます。
タイトルケース
タイトルが CMS から取得される場合は、スマートなタイトルケースを適用します。
- 小さな単語(a、an、the、and、but、for、in、of など)は、先頭または末尾にある場合を除き小文字にします
- ブランド名は常に正しい表記にします(WordPress、JavaScript、GitHub、macOS など)
- 既知の頭字語は大文字にします(AI、API、CSS、HTML、UI、UX)
- ハイフンでつながれた単語は、それぞれの部分を個別に大文字で始めます
メタデータとの統合
generateMetadata() で OG ルートを参照します。
export function generateMetadata({ params }) {
return {
openGraph: {
images: [`/api/og?slug=${params.slug}`],
},
};
}
静的ページでは、タイトルを直接渡します:/api/og?title=About。
Satori の規則
これらは next/og レンダリングエンジン(Satori)の必須要件です。
- すべての要素に
display: "flex"が必要です — 使用できるレイアウトモードはこれだけです - インラインスタイルのみ — CSS クラス、外部スタイルシート、CSS 変数は使用できません
- すべてのテキストを要素内に配置し、スタイルプロパティを明示的に指定します
- 16 進数カラーを使用します —
rgb()、hsl()、CSS 変数は使用できません - 古いバージョンでは
gapを使用できません — 使用する前にテストし、代わりにマージンを使います
よくある問題
| 問題 | 解決策 |
|---|---|
| テキストが表示されない | テキストのラッパーに display: "flex" を追加します |
| レイアウトが崩れる | すべてのコンテナーに display: "flex" が指定されていることを確認します |
| 色がおかしい | CSS 変数ではなく、16 進数カラーを使います |
| フォントが読み込まれない | ルートファイルから public/fonts/ への相対パスを確認します |
| 画像が表示されない | 相対パスは使わず、base64 データ URI に変換します |
テスト
開発中は、ブラウザーでルートに直接アクセスしてプレビューします。
http://localhost:3000/api/og?title=Hello+World
ビルド後、ビルド出力でルートが動的(f 接頭辞)として登録されていることを確認します。