用 Content Collections 讓錯的文章連建置都過不了

用 Markdown 寫部落格最常見的問題不是「寫不出來」,而是 frontmatter 打錯字之後 ——date 寫成 data、日期少了一位數——網站照樣建置成功,只是那篇文章排到了 1970 年。

Astro 的 Content Collections 用 schema 把這件事擋在建置階段:

const blog = defineCollection({
  loader: glob({ base: './src/content/blog', pattern: '**/*.md' }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    excerpt: z.string().optional(),
  }),
});

少了 titledateastro build 直接失敗,而且訊息會指出是哪一個檔案的哪一個欄位。

為什麼用 z.coerce.date()

YAML 的 2026-07-02 會被解析成 Date,但如果作者寫成 "2026-07-02"(帶引號)就是字串。 z.coerce.date() 兩種都吃,進到程式一律是 Date 物件——排序時就不會踩到「字串比較」的坑。

Comments