约 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
| Feature | Content Collections | Full CMS |
|---|---|---|
| Setup | Zero config | Database + API |
| Version Control | Built-in (Git) | Manual |
| Type Safety | Yes (Zod) | Depends |
| Performance | Static files | Dynamic queries |
| Deployment | Any static host | Requires server |
When to Use Full CMS
- 多作者协作
- 需要富文本编辑器
- 复杂的媒体管理
- 动态内容(评论、用户生成)
My Setup
这个博客使用 Content Collections:
- Blog:文章集合
- Projects:项目集合
- Pages:静态页面集合
所有内容都是 MDX 文件,支持:
- Markdown 语法
- 组件嵌入
- 代码高亮
- 数学公式(KaTeX)
Summary
Content Collections 是个人博客的理想选择。它们提供足够的结构来保持一致性,同时保持文件工作流的简洁性。
Built with Astro Content Collections.