工程实践 / ARTICLE

用内容集合管理一座持续生长的网站

让 Markdown、结构化元数据和共享模板各司其职,新增文章不再伴随复制粘贴。

网站的第一篇文章总是容易发布:复制一个页面,换掉标题和正文即可。到了第二十篇,问题开始出现——某些页面的日期格式不同,旧模板缺少 canonical 链接,分类名称有三种写法,修改页脚还要打开二十个文件。

可维护的内容站需要把“内容”和“呈现方式”分开。Markdown 负责文章,结构化元数据负责描述,模板负责一致的 HTML。

先设计内容模型

一篇技术文章通常需要标题、摘要、发布时间、分类、标签和草稿状态。把这些字段写进 frontmatter 后,构建工具就能验证它们,而不是等页面上线才发现日期为空。

---
title: "文章标题"
description: "用于列表页和搜索结果的独立摘要"
publishedAt: 2026-04-07
category: "工程实践"
tags: ["Astro", "内容模型"]
draft: false
---

摘要不应简单截取正文第一段。列表页需要在有限空间里说明文章价值,搜索结果也需要一句独立、完整的描述。

分类和标签要承担不同职责。分类数量少,用于定义站点的主要范围;标签更细,帮助关联具体技术。若每篇文章都创造一个新分类,分类就失去了导航意义。

让 schema 阻止低级错误

Astro 内容集合可以用 schema 声明字段类型。日期被转换为真正的 Date,缺少标题时构建直接失败,草稿状态也有确定的默认值。

这种“尽早失败”很适合静态站。构建失败发生在发布前,访客不会看到只渲染一半的页面。内容规模越大,schema 的价值越明显。

除了类型,还可以逐步加入业务约束,例如摘要长度、允许的分类集合、更新时间不能早于发布时间。不要一次建立过度复杂的编辑系统;从真实出现的错误反推规则更有效。

URL 应该稳定

文章 URL 最好由文件名或显式 slug 决定,而不是包含可能修改的标题。发布日期通常也不必放进路径,否则调整日期会改变地址。

一个稳定结构可以是:

/articles/browser-local-first-tools/

标题可以重写,视觉模板可以替换,URL 仍然不变。如果确实需要改路径,要在 _redirects 中保留永久重定向,避免旧链接和搜索权重丢失。

模板负责那些容易忘记的事

文章布局不只是包住正文。它还应统一生成标题、描述、canonical、Open Graph、发布时间、阅读时长、导航与页脚。广告组件也应在一个位置控制,未配置发布商 ID 时完全不加载第三方脚本。

这会让内容作者只关注文章本身。一次模板修复可以覆盖全部页面,而不是依赖日后的手工记忆。

一次安全的发布流程

内容更新可以保持短小:新建 Markdown,运行本地预览,检查构建,然后部署。脚本应读取锁文件安装相同依赖,并固定 Node 主版本。

发布前至少确认:

  1. 新文章没有保留草稿状态;
  2. 内部链接可以访问;
  3. 移动端标题没有严重溢出;
  4. RSS 与站点地图包含新页面;
  5. 构建产物没有意外的大型资源。

内容集合的目的不是把写作变成数据库录入,而是把重复、容易错的部分交给系统。维护成本降低后,网站才更可能真正持续生长。

END