Last updated on

为什么我选择 Astro 而不是纯博客


博客已经不是博客

我在技术领域写了四年文章,用过不少博客引擎:WordPress、Hugo、Gatsby、hexo,也试过 Jekyll。

每一代工具都解决了一个具体痛点:Hugo 快,WordPress 后台强,Gatsby 生态好。

但到了 2025 年,我意识到一个本质问题:我没有「写博客」的问题,我有「内容架构」的问题。

我的个人网站不止博客。它包含:

  • 项目卡片页(projects):展示 bbfans-portal、copilot-agent-lite、kijiji-real-time-monitor 等项目状态
  • 上线动态页(changelog):不定期发布变更记录
  • 技术博客(blog):深度学习文章

这三类内容共享同一作者品牌,但在首页需要区分展示。

Hugo 的困境

# Hugo front matter
---
title: "My Post"
date: 2025-05-20
tags: [tech]
---

# Content

在 Hugo,这三类内容通常放在不同主题色文件夹中。每类用不同的模板渲染没问题,但用 Go template 实现跨 Collection 的关联、统一的 excerpt 生成、tag system 共享,会变成模板体力活。

直接上运行时存储的困境

我之前试过把内容放进运行时键值存储:

-- content schema (概念级)
key: "blog:2025-05-18-building-kijiji-monitor"
value: JSON { title, html_content, tags, pubDate }

这能工作,但缺点很明显:SVN archaeology。 每次改 schema 都要手动迁移 key、清理旧字段、维护 one-off 脚本。

为什么 Astro Content Collections?

Astro 解决的是Git 即是 CMS的问题。

// src/content/config.ts
const blog = defineCollection({
  loader: glob({ base: "./src/content/blog", pattern: "**/*.{md,mdx}" }),
  schema: z.object({
    title: z.string(),
    description: z.string(),
    pubDate: z.coerce.date(),
    updatedDate: z.coerce.date().optional(),
    heroImage: z.string().optional(),
    featured: z.boolean().default(false),
  }),
});

每个人的 schema 不一样。这不是博客写作,这是数据建模

一个文件 = 一段内容 = 一个事实来源

# Markdown 就是你的 CMS 数据库
ls src/content/
├── blog/       # 技术博客(.md / .mdx)
├── projects/   # 项目卡片
└── changelog/  # 上线动态

每次 git push → 自动构建 → 新内容上线,不需要 admin dashboard,不需要 API 调用。

Git 是多语言版本控制,不是 CMS 版本控制

# changelog vs blog 的结构化 diff
git diff HEAD~1 src/content/changelog/...  # 上线动态变更
git diff HEAD~1 src/content/blog/...       # 博客编辑
git blame src/content/blog/2025-05-18-building-kijiji-monitor.md   # 内容溯源

# CI 会自动从 ASTRO_DATA_SHEMA 验证 frontmatter

博客、项目、changelog 分开追踪,git 可以单独 revert 每类。

可组合渲染

import HeaderLink from '../../components/HeaderLink.astro';

<HeaderLink href="/projects/copilot-agent-lite">
  参考 copilot-agent-lite 项目
</HeaderLink>

Astro 的 0kb JS 默认模式 + @astrojs/mdx 支持在文章里直接 import 组件。Hugo/hexo 做不到这点。

结论

如果你只是想“写文章”,用 WordPress 或 Notion。 但如果你是一个技术工程师,想把项目状态、上线动态、个人博客全部放在同一个 Git repo,用 Astro Content Collections,这是当前 100% pure Git 方案的最优解。