关于 og-images
这项技能介绍如何在 Next.js 中用 `next/og` 和 `ImageResponse` 生成动态 OpenGraph 与 Twitter 图片,面向制作社交分享卡片的开发者,涵盖文件路由和 API 路由。
主要功能
- 01文件路由与 API 路由方案
- 02OpenGraph 和 Twitter 图片尺寸
- 03动态标题与元数据接入
- 04布局、字体和可选品牌元素指引
- 05Satori 样式要求
适用场景
- 01为静态页面生成分享卡片
- 02为 CMS 内容创建图片
- 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",将内容与品牌标识分开 - 标题和副标题(例如作者姓名)放在左上方,并使用纵向排列的 flex 列
- 标题:字号较大、字重为粗体或中等、颜色较深
- 副标题:字号相同或更小、字重较轻、颜色较淡(例如
#888) - 文本左对齐,使用
textWrap: "balance",并通过maxWidth限制宽度 - 大字号下使用
letterSpacing: "-0.02em",营造紧凑的编辑风格 - 内边距:在 1200x630 图片中,四周使用
48px效果不错
头像/Logo(可选)
如果项目有头像或 Logo,可使用 justifyContent: "flex-end" 的 flex 容器将其放在右下角。通过 fetch + arrayBuffer 加载图片,并将其转换为 base64 数据 URI 作为 src。圆形头像使用 borderRadius: "50%"。将已加载的资源缓存到 Map 中,避免重复获取。
自定义字体
使用 new URL("../../../public/fonts/YourFont.ttf", import.meta.url) 从 public/fonts/ 加载 .ttf 文件。通过 fonts 选项将 ArrayBuffer 传给 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 变量
- 所有文本都必须放在元素中,并显式设置样式属性
- 使用十六进制颜色——不使用
rgb()、hsl()或 CSS 变量 - 较旧版本不支持
gap——使用前先测试;必要时改用margin
常见问题
| 问题 | 解决方案 |
|---|---|
| 文本未渲染 | 为文本包装元素添加 display: "flex" |
| 布局错乱 | 确保所有容器都设置了 display: "flex" |
| 颜色不正确 | 使用十六进制颜色,而非 CSS 变量 |
| 字体未加载 | 检查路由文件到 public/fonts/ 的相对路径 |
| 图片未显示 | 转换为 base64 数据 URI,不要使用相对路径 |
测试
开发期间,可直接在浏览器中访问路由进行预览:
http://localhost:3000/api/og?title=Hello+World
构建后,检查构建输出,确认路由已注册为动态路由(f 前缀)。