Blog
MDX 即内容,git 即 CMS:文章是 src/content/blog/ 下的 Markdown/MDX 文件
(fumadocs-mdx collection,定义在 source.config.ts),发布就是一次 commit + 部署。
没有后台、没有数据库表、没有运行时依赖——评审走 PR,回滚走 git revert。
Frontmatter 字段
| 字段 | 必填 | 说明 |
|---|---|---|
title | ✓ | 文章标题(也是 OG 卡片的主文案) |
description | ✓ | 摘要,用于列表页、<meta>、RSS |
date | ✓ | YYYY-MM-DD,列表按此新→旧排序 |
author | 缺省 FlareStarter Team | |
tags | 字符串数组,缺省 [] | |
published | 缺省 true;设 false 即从列表/详情/RSS/sitemap 全体下架 | |
image | 可选自定义 OG 图(相对 public/),缺省用构建期生成的 /og/blog/<slug>.png |
中文变体:.zh 文件名,缺失回退英文
与 changelog 同一套约定——post.md 是英文,post.zh.md 是中文变体,slug 相同。
差别在回退策略:changelog 是扁平信息流,zh 缺失就隐藏;blog 每篇有独立页面,
zh 缺失时详情页回退英文而不是 404(选取逻辑与单测在 src/features/blog/select.ts)。
英文版是每篇文章的规范存在:/rss.xml 与 sitemap 只收英文集(中文读者在站内切
语言),详情页输出 Article JSON-LD,mainEntityOfPage 按 locale 指向对应 URL。
OG 社交卡片:构建期生成,不在边缘渲染
pnpm og:generate 把每篇文章渲染成 1200×630 的 PNG(public/og/blog/<slug>.png)。
故意不做成运行时 Worker 路由:satori/resvg-wasm 在边缘意味着 wasm 包、字体加载和
冷启动开销,而这些图在构建时就完全确定——静态文件是更便宜也更稳的答案。
生成后的 PNG 要一并 commit——部署产物直接取自 git,CI 不会替你重跑生成。
中文变体共用同一张卡片;想单独定制,用 frontmatter 的 image 字段覆盖。
发一篇新文章
- 新建
src/content/blog/my-post.md(可选配my-post.zh.md),填好 frontmatter。 pnpm og:generate,commit 生成的 PNG。pnpm build(collection 在构建期编译,frontmatter 缺字段会在这里报错)。- 本地
pnpm dev看一眼/blog/my-post,然后照常部署。
列表页 /blog、详情页 /blog/$slug 都在 locale 路由组内,双语路径
(/zh/blog/...)开箱即用,见 国际化与 SEO。