AstroPaper v1.4.0 的新功能,为博客文章引入动态 OG 图像生成。
目录
介绍
OG 图像(也称为社交图像)在社交媒体互动中发挥着重要作用。如果你不知道 OG 图像是什么意思,它是当我们在 Facebook、Discord 等社交媒体上分享网站 URL 时显示的图像。
Twitter 使用的社交图像在技术上不叫 OG 图像。但是,在这篇文章中,我将使用 OG 图像这个术语来指代所有类型的社交图像。
默认/静态 OG 图像(旧方式)
AstroPaper 已经提供了向博客文章添加 OG 图像的方法。作者可以在前置元数据 ogImage
中指定 OG 图像。即使作者没有在前置元数据中定义 OG 图像,也会使用默认的 OG 图像作为后备(在这种情况下是 public/astropaper-og.jpg
)。但问题是默认的 OG 图像是静态的,这意味着每个不在前置元数据中包含 OG 图像的博客文章都会始终使用相同的默认 OG 图像,尽管每篇文章的标题/内容都不同。
动态 OG 图像
为每篇文章生成动态 OG 图像可以让作者避免为每篇博客文章指定 OG 图像。此外,这将防止后备 OG 图像对所有博客文章都相同。
在 AstroPaper v1.4.0 中,使用 Vercel 的 Satori 包进行动态 OG 图像生成。
动态 OG 图像将在构建时为以下博客文章生成:
- 前置元数据中不包含 OG 图像
- 未标记为草稿。
AstroPaper 动态 OG 图像的结构
AstroPaper 的动态 OG 图像包括_博客文章标题_、作者姓名_和_网站标题。作者姓名和网站标题将通过 “src/config.ts” 文件的 SITE.author
和 SITE.title
获取。标题从博客文章前置元数据的 title
生成。
非拉丁字符问题
包含非拉丁字符的标题无法开箱即用地正确显示。要解决这个问题,我们必须用你首选的字体替换 loadGoogleFont.ts
中的 fontsConfig
。
async function loadGoogleFonts(
text: string
): Promise<
Array<{ name: string; data: ArrayBuffer; weight: number; style: string }>
> {
const fontsConfig = [
{
name: "Noto Sans JP",
font: "Noto+Sans+JP",
weight: 400,
style: "normal",
},
{
name: "Noto Sans JP",
font: "Noto+Sans+JP:wght@700",
weight: 700,
style: "normal",
},
{ name: "Noto Sans", font: "Noto+Sans", weight: 400, style: "normal" },
{
name: "Noto Sans",
font: "Noto+Sans:wght@700",
weight: 700,
style: "normal",
},
];
// ...
}
src/utils/loadGoogleFont.ts
查看这个 PR 了解更多信息。
权衡
虽然这是一个很好的功能,但有一个权衡。每个 OG 图像大约需要一秒钟来生成。起初这可能不太明显,但随着博客文章数量的增长,你可能想要禁用此功能。由于每个 OG 图像都需要时间生成,拥有很多图像会线性增加构建时间。
例如:如果一个 OG 图像需要一秒钟生成,那么 60 个图像将需要大约一分钟,600 个图像将需要大约 10 分钟。随着内容规模的扩大,这可能会显著影响构建时间。
相关问题:#428
限制
在撰写本文时,Satori 还相当新,尚未达到主要版本。因此,这个动态 OG 图像功能仍然存在一些限制。
- 此外,尚不支持 RTL 语言。
- 在标题中使用表情符号可能有点棘手。