JM
← 返回文章
约 2 分钟阅读 更新于 2026年5月20日

Astro Content Collections as Personal CMS

为什么类型化的 Frontmatter 对于专注的个人发布工作流来说已经足够。


Astro Content Collections 是松散的 Markdown 文件和完整 CMS 之间的实用中间地带。它们保持写作工作流基于文件,同时为应用程序提供类型化的元数据。

Why Collections Help

Frontmatter 从小开始,然后增长。一篇文章最初可能只需要标题和日期,然后是标签、草稿状态、精选状态、Open Graph 图片和更新时间戳。

Content Collections 用 Zod schema 验证这些字段:

const blog = defineCollection({
  type: "content",
  schema: z.object({
    title: z.string(),
    description: z.string(),
    pubDate: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
    featured: z.boolean().default(false)
  })
});

Type Safety

在编辑器中,你会得到:

  • 自动补全
  • 类型检查
  • 错误提示
// ✅ 正确
const posts = await getCollection("blog", ({ data }) => !data.draft);

// ❌ 错误 - 编辑器会提示
const posts = await getCollection("blog", ({ data }) => !data.isDraft);

File-Based Workflow

src/content/blog/
├── my-post.mdx
├── another-post.mdx
└── draft-post.mdx

每个文件就是一个文章,frontmatter 就是元数据。没有数据库,没有 API,只有文件。

Querying Content

// 获取所有已发布的文章
const posts = await getCollection("blog", ({ data }) => !data.draft);

// 按日期排序
const sortedPosts = posts.sort(
  (a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
);

// 获取精选文章
const featuredPosts = posts.filter(({ data }) => data.featured);

Advantages Over Full CMS

FeatureContent CollectionsFull CMS
SetupZero configDatabase + API
Version ControlBuilt-in (Git)Manual
Type SafetyYes (Zod)Depends
PerformanceStatic filesDynamic queries
DeploymentAny static hostRequires server

When to Use Full CMS

  • 多作者协作
  • 需要富文本编辑器
  • 复杂的媒体管理
  • 动态内容(评论、用户生成)

My Setup

这个博客使用 Content Collections:

  • Blog:文章集合
  • Projects:项目集合
  • Pages:静态页面集合

所有内容都是 MDX 文件,支持:

  • Markdown 语法
  • 组件嵌入
  • 代码高亮
  • 数学公式(KaTeX)

Summary

Content Collections 是个人博客的理想选择。它们提供足够的结构来保持一致性,同时保持文件工作流的简洁性。


Built with Astro Content Collections.