跳到主要内容

内容集合:把 Markdown 变成类型安全的数据

Astro 的 content collections 不只是 glob 一层封装,schema 让每一篇文章在构建期就被校验,写错字段会直接失败。

215 字

getCollection("posts") 返回的不是一堆字符串,而是按 schema 解析过的对象。这意味着 post.data.pubDatetime 在类型上就是 Date,不需要在模板里再转换一次。

const posts = defineCollection({
loader: glob({ pattern: "**/[^_]*.{md,mdx}", base: "./src/content/posts" }),
schema: z.object({
title: z.string(),
pubDatetime: z.coerce.date(),
tags: z.array(z.string()).default([]),
}),
});

为什么值得多写这些

schema 的价值在出错的时候才体现。少写一个 title、把日期写成 2026-13-01、给 tags 传字符串而不是数组,都会在构建期报错,而不是等到页面上出现 undefined。

另一个好处是默认值:z.array(z.string()).default([]) 让没有标签的文章也能正常渲染,模板里不用到处写 post.data.tags ?? []。

一点取舍

内容模型一旦确定,改字段就要改 schema 和所有用到它的地方。小站点上这算不上负担;但如果只是临时放几页静态文字,单独的 Markdown 页面可能更省事。

版权声明

本文由 XiaYe 创作,采用 CC BY-NC-SA 4.0 许可协议;转载请注明出处。

作者
XiaYe
发布于
许可协议
CC BY-NC-SA 4.0

分享这篇文章:

相关文章

评论

留下你的想法,或看看别人说了什么。