跳转到内容
文韬博宇的个人主页
返回

【转载】AstroPaper 博客文章动态 OG 图片生成

更新于:
· 约 2 分钟· 约 754 字阅读0编辑页面

AstroPaper v1.4.0 的新功能:博客文章动态 OG 图片生成。

AstroPaper 博客文章动态 OG 图片生成

Table of contents

Open Table of contents

简介

OG 图片(即社交图片)在社交媒体分享中扮演着重要角色。如果你不知道什么是 OG 图片,它就是当你在 Facebook、Discord 等社交媒体上分享网站 URL 时所显示的那张图片。

Twitter 使用的社交图片严格来说并不叫 OG 图片。不过在这篇文章中,我会用”OG 图片”这个术语来指代所有类型的社交图片。

默认/静态 OG 图片(旧方案)

AstroPaper 已经提供了一种为博客文章添加 OG 图片的方法。作者可以在 frontmatter 中通过 ogImage 字段指定 OG 图片。即使作者没有在 frontmatter 中定义 OG 图片,系统也会使用默认 OG 图片作为兜底方案(此时为 public/default-og.jpg)。但问题在于,默认 OG 图片是静态的,这意味着所有未在 frontmatter 中包含 OG 图片的博客文章都会使用同一张默认图片,尽管每篇文章的标题和内容各有不同。

动态 OG 图片

为每篇文章生成动态 OG 图片,可以让作者无需为每篇博客文章单独指定 OG 图片。同时也能避免兜底图片与所有博客文章千篇一律的问题。

在 AstroPaper v1.4.0 中,使用了 Vercel 的 Satori 包来生成动态 OG 图片。

在 AstroPaper v6 及以上版本中,核心思路不变(Satori 将 SVG 渲染为图片,再通过 Sharp 生成 PNG),但字体改为从 Astro 的 Fonts 配置中获取,并通过 experimental_getFontFileURL() 加载,从而使 OG 生成可以复用网站相同的字体管道。

动态 OG 图片会在构建时为符合条件的博客文章生成,具体条件为:

AstroPaper 动态 OG 图片的组成

动态 OG 图片包含:博客文章标题作者名称网站标题。作者名称和网站标题分别从 astro-paper.config.ts 中的 site.authorsite.title 获取,标题则从博客文章 frontmatter 的 title 字段生成。

动态 OG 图片示例链接

非拉丁字符的问题

Caution

默认情况下,包含非拉丁字符的标题无法正确显示。请将 Google 字体族切换为覆盖你所用书写系统的字体,并同时包含 400700 两种字重——Satori 对常规和粗体使用独立的缓冲区,缺少任一种都会导致渲染不一致。

import { defineConfig, fontProviders } from "astro/config";

export default defineConfig({
  fonts: [
    {
      // Example: Japanese coverage (pick what you need for your audience)
      name: "Noto Sans JP",
      cssVariable: "--font-google-sans-code",
      provider: fontProviders.google(),
      fallbacks: ["monospace"],
      weights: [400, 700],
      styles: ["normal", "italic"],
      formats: ["woff", "ttf"],
    },
  ],
});astro.config.ts

如果修改了 cssVariable,还需同步更新以下文件中的对应键:

更多详情可参阅 此 PR

注意事项
  • 构建时间会随内容量增长——每个符合条件的文章都会在构建时生成一张 PNG。v6 版本生成速度更快(PR #632),但在超大型网站上可以通过 astro-paper.config.ts 中的 features.dynamicOgImage: false 将其禁用。
  • RTL 语言(从右到左书写)暂不支持。
  • 标题中的 Emoji 可能会有渲染问题——部分 Emoji 可能无法正确显示。

编辑页面
分享这篇文章:

评论


上一篇
【转载】AstroPaper 主题中新增博客文章