YAML Frontmatter (前置元数据)
Markdown 文件顶部由 --- 包裹的那一块,是描述这个文件本身的元数据,不属于正文。
---
title: 我的笔记
tags:
- type/note
- domain/cs-ai
date: 2026-08-07
---
正文从这里开始。名字的来源
这个术语是两部分拼起来的。
front matter 借自出版业。front 是前面,matter 在出版术语里指书稿内容。一本书正文之前的那几页(封面、版权页、献词、目录)就叫 front matter:它们不是正文,而是描述这本书本身——谁写的、何时印的、分几章。
Markdown 顶部这块头干的是同一件事:不是正文,而是描述这个文件(标题、标签、日期、别名)。所以叫「前置内容」。
YAML 是写它的格式。YAML (YAML Ain't Markup Language) 是一种以缩进表达层级的数据序列化格式,key: value 加缩进列表就是它的语法。
合起来,YAML frontmatter = 用 YAML 语法写在文件头部的前置元数据。
这个约定来自 Jekyll
这套写法不是笔记软件发明的。2008 年前后,静态站点生成器 Jekyll(GitHub Pages 的默认引擎)引入了这个约定:在 Markdown 文件顶部用 --- 包一段 YAML 写元数据,官方文档称之为 YAML Front Matter。Jekyll 用它决定文章标题、发布日期、用哪个模板渲染。
后来的生态基本全部沿用:
- Hugo — Go 写的静态站点生成器,以构建速度快著称,是 Jekyll 最主要的替代品
- Obsidian — 用 frontmatter 里的 tags / aliases 驱动标签系统和双链
- VitePress / Docusaurus / Astro — 现代文档站,用它控制页面标题、侧边栏位置、是否草稿
所以今天你在任何笔记工具或博客框架里看到这块头,都是同一个传统的延续。
位置是硬约定
解析器只认文件最开头的 --- 块。第一行必须是 ---,中间不能有空行或其他内容。
写在文件中间的 --- 只是普通的 Markdown 水平分隔线,不会被当作元数据。这也解释了它为什么必须在顶部:它是「文件级」的信息,解析器读第一行就要拿到它,才能决定后面怎么处理。
分隔符的语义
--- 本身就是 YAML 标准里的文档起始标记 (document start marker)。YAML 允许一个文件里放多个文档,用 --- 分隔。frontmatter 正是借用了这个机制:把元数据当作第一个 YAML 文档,--- 天然地把它和后面的正文隔开。
不是只能用 YAML
同一个「文件头元数据」的位置,格式可以替换:
| 格式 | 分隔符 | 常见于 |
|---|---|---|
| YAML | --- | Jekyll、Obsidian、Hugo(默认) |
| TOML | +++ | Hugo |
| JSON | { } | Hugo、部分工具链 |
YAML 是事实标准,因为最易读,且是 Jekyll 留下的老传统。
常见坑
- 缩进只能用空格,不能用 Tab。YAML 明确禁止 Tab 缩进,用了会解析失败。
- 冒号后必须有空格。
tags:value不合法,要写tags: value。 - 含特殊字符的值要加引号。值里出现
:、#、[等符号时,用引号包住:title: "第 3 章: 开始"。 - YAML 会自作聪明转换类型。
yes/no/on/off会被解析成布尔值,1.0会变成数字。想要字符串就加引号。
关联
- Unicode 与编码 (Unicode and Encoding) — 笔记文件应统一存为 UTF-8 无 BOM,BOM 会让 frontmatter 解析失败
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/General