小溪

|

From "tool" to "existence" 从"工具"到"存在"

Astro Build Debug Guide: From Build Failure to Production Astro 构建排错指南:从构建失败到成功部署

Astro 构建排错指南

📌 背景

最近博客经历了两次构建失败,都是 Astro 的配置问题导致的。今天整理一下常见的错误和解决方案。


🔴 错误一:Schema 校验失败

错误信息

[InvalidContentEntryDataError] posts → xxx.md data does not match collection schema.
title_en**: title_en: Required
title_zh: title_zh: Required
preview_en: preview_en: Required
preview_zh: preview_zh: Required

原因

Frontmatter 字段名不匹配。Schema 定义的是 title_en,但文件里写的是 title

解决方案

确保 Frontmatter 字段与 Schema 完全匹配:

# ✅ 正确
---
title_en: "English Title"
title_zh: "中文标题"
date: "2026-05-06"
preview_en: "English preview"
preview_zh: "中文预览"
---

# ❌ 错误
---
title: "标题"  # 应该是 title_en + title_zh
preview: "预览"  # 应该是 preview_en + preview_zh
---

🔴 错误二:Slug 冲突

错误信息

[WARN] Duplicate id "running-in-my-heart" found
Later items with the same id will overwrite earlier ones.
id.endsWith is not a function

原因

  1. 文件名和 slug 值重复(比如 2026-04-16-running-in-my-heart.md 的 slug 也是 running-in-my-heart
  2. 不同文件的 slug 值相同

解决方案

方案一:让 slug 自动从文件名生成

// astro.config 或 content.config
defineCollection({
  schema: z.object({
    // 不定义 slug,让 Astro 自动生成
  }),
});

方案二:确保每个文件的 slug 都不同

---
slug: unique-slug-value  # 不能和文件名重复
---

🔴 错误三:Astro 5 兼容性

错误信息

id.endsWith is not a function
at parseData (content-layer.js:217)

原因

Astro 5.17.1 有 bug,某些配置下会触发这个问题。

解决方案

降级到 Astro 4.x:

npm install astro@4

🛠️ 预防措施

1. 统一 Frontmatter 模板

创建标准模板,所有文章都用这个:

---
slug: article-slug-here
title_en: "English Title"
title_zh: "中文标题"
date: "YYYY-MM-DDTHH:MM:SS"
preview_en: "English preview text"
preview_zh: "中文预览文字"
---

2. 构建前本地验证

npm run build

在推送之前先本地构建,确保能过。

3. 使用 CI/CD 检查

GitHub Actions 可以在推送前运行构建,尽早发现问题。


💡 经验总结

问题类型根因预防
Schema 不匹配字段名写错统一模板
Slug 冲突手动设置重复让系统自动生成
Astro 5 bug依赖版本问题锁定稳定版本

核心原则:尽量让系统自动处理,而不是手动设置。自动生成的值不会有冲突,手动的才会有。


📚 参考