详细说明 iflux-next 项目中 blog 和 docs 两个站点的 Frontmatter 字段定义、文件组织方式和侧边栏配置,包括 _meta.json 排序机制、折叠分组和 Zod 校验逻辑。
iflux-next 项目包含两个内容站点:blog(技术博客)和 docs(文档中心)。它们共享同一套内容引擎 @iflux/utils,但在 Frontmatter 字段、文件组织和侧边栏配置上各有差异。
这篇文章系统梳理两者的规范,方便后续写作时直接参考。
Frontmatter 是 Markdown/MDX 文件顶部的 YAML 元数据区域,用 --- 包裹,用于定义文章的标题、日期、分类等信息。
---
title: 文章标题
excerpt: 文章摘要
category: 分类名
tags: [标签1, 标签2]
date: "2026-04-26"
---两个站点的内容目录位于各自的 src/content/ 下,支持 .mdx 格式。构建时通过 gray-matter 解析 Frontmatter,并通过 @iflux/utils 的 Zod Schema 进行校验。
Blog 的文章统一放在 src/content/posts/ 目录下,每个 .mdx 文件即一篇文章,文件名即为 slug:
src/content/posts/ ├── frontmatter-guide.mdx ├── wsl2-arch-install.mdx └── ...
访问路径为 /posts/<slug>,例如 /posts/frontmatter-guide。
Blog 的 Frontmatter 通过 PostFrontmatterSchema 进行 Zod 校验:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
title | string | 否 | 文章标题,为空时取文件名 |
date | string | 否 | 发布日期,格式 YYYY-MM-DD,为空时取空字符串 |
description | string | 否 | SEO 描述,用于 <meta name="description"> |
excerpt | string | 否 | 文章摘要,显示在文章列表卡片 |
category | string | 否 | 分类名称 |
tags |
文章标题,显示在文章详情页、列表卡片和浏览器标签栏中。同时作为 SEO 的 <title> 和 Open Graph 标题。为空时降级为文件名(slug)。
控制文章在列表中的排序(新文章在前)。推荐加引号以避免 YAML 将日期解析为对象:
date: "2026-04-26"SEO 描述字段,对应 HTML 中的 <meta name="description">,影响搜索引擎摘要显示。建议控制在 150 字符以内:
description: 在 WSL2 中安装 Arch Linux 的完整步骤,包括系统初始化、镜像源配置和开发环境搭建。文章摘要,显示在文章列表卡片中。与 description 的区别:excerpt 是面向读者的内容预览,description 是面向搜索引擎的 SEO 描述。两者可以写不同的内容。
文章分类,用于侧边栏筛选和文章归类:
category: 开发标签用于文章筛选,侧边栏会展示所有标签及其文章数量。两种写法等价:
tags: [标签1, 标签2, 标签3]tags:
- 标签1
- 标签2
- 标签3封面图片 URL,支持外部链接。显示位置:
cover: https://img.iflux.art/arch-wsl2-cover.png草稿标记,设为 true 时文章默认不会出现在列表页中:
draft: truegetAllPosts() 默认过滤草稿。如需在预览环境中查看草稿,可使用 getAllPosts({ includeDrafts: true })。
---
title: WSL2 安装 Arch Linux 完整指南
description: 在 WSL2 中安装 Arch Linux 的完整步骤摘要,适合搜索引擎收录。
excerpt: 从零开始在 WSL2 上部署 Arch Linux,包括系统初始化、镜像源配置和开发环境搭建。
category: 开发
tags: [Arch Linux, WSL2
Docs 按目录组织,每个目录下可以放置 _meta.json 文件来控制侧边栏的排序和显示名称:
src/content/docs/ ├── _meta.json ├── index.mdx ├── getting-started/ │ ├── _meta.json │ ├── index.mdx │ ├── introduction.mdx │ └── installation.mdx ├── grammar/ │ ├── _meta.json │ ├── index.mdx │ ├── general/ │ │ ├── _meta.json │ │ └── markdown.mdx │ └── shell/ │ ├── _meta.json │ └── bash.mdx └── ...
_meta.json 是 Docs 站点独有的侧边栏配置文件,每个目录下都可以放置一个。
每个 _meta.json 是一个 JSON 对象,键为文件名或目录名(不含扩展名),值为显示名称(字符串)或配置对象:
{
"getting-started": "快速开始",
"grammar": "语法基础",
"system": "操作系统"
}对象格式支持额外配置:
{
"index": "智能体",
"claude-code": "Claude Code",
"openclaw": {
"title": "OpenClaw",
"collapsed": true
}
}| 属性 | 类型 | 说明 |
|---|---|---|
title | string | 显示名称 |
icon | string | 图标(预留) |
order | number | 排序权重,越小越靠前 |
collapsed | boolean | 是否在侧边栏中默认折叠该分组 |
子目录可以有自己的 _meta.json,控制子项的排序和名称:
// grammar/_meta.json
{
"index": "语法基础",
"general": "通用语法",
"shell": "Shell 与命令行",
"tools": {
"title": "开发工具",
文档标题的来源优先级(从高到低):
title 字段 — 最高优先_meta.json 中配置的名称在 _meta.json 中将某个分组设为 collapsed: true 后,该分组在侧边栏中默认折叠,点击标题可展开/收起:
{
"index": "语法基础",
"general": "通用语法",
"shell": {
"title": "Shell 与命令行",
"collapsed": true
}
}未设置 collapsed 的分组默认展开。
Docs 的 Frontmatter 通过 DocsFrontmatterSchema 进行 Zod 校验:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
title | string | 否 | 文档标题,会被 _meta.json 覆盖 |
description | string | 否 | SEO 描述,用于 <meta name="description"> |
cover | string | 否 | 封面图片 URL |
order | number | 否 | 排序权重(预留) |
Docs 不需要
date、tags、category等字段,因为分类由目录结构决定,排序由_meta.json控制。
---
title: WSL2 安装与通用配置指南
description: Windows 上的 WSL2 从零安装到开发环境搭建的完整配置流程。
---| 特性 | Blog | Docs |
|---|---|---|
| 内容目录 | apps/blog/src/content/posts/ | apps/docs/src/content/docs/ |
| 文件格式 | .mdx | .mdx |
| 分类方式 | category 字段 | 目录结构 |
| 侧边栏排序 | 按文章日期倒序 | _meta.json 配置 |
| 显示名称 | 取 frontmatter title | _meta.json 优先于 frontmatter title |
| 日期字段 | date | 无 |
| 标签系统 | 有(tags 字段) | 无 |
Blog 以时间线组织内容,侧重发布日期和标签分类;Docs 以目录树组织内容,侧重层级结构和 _meta.json 排序。两者都支持通过目录嵌套实现多级分类。
apps/blog/src/content/posts/ 下创建 .mdx 文件my-post.mdx---
title: 文章标题
description: SEO 描述,150 字符以内
excerpt: 文章摘要,显示在列表卡片中
category: 分类名
tags: [标签1, 标签2]
date:
apps/docs/src/content/docs/ 对应分类目录下创建 .mdx 文件_meta.json 中添加条目并设置显示名称title 和 description):---
title: 文档标题
description: 文档的 SEO 描述
---Blog 的 Frontmatter 通过 @iflux/utils 提供的 parsePostFrontmatter 函数进行校验,底层使用 Zod:
const PostFrontmatterSchema = z.object({
title: z.string().optional(),
date: z.union([z.string(), z.date()]).optional
Docs 的 Frontmatter 通过 parseDocsFrontmatter 函数进行校验:
const DocsFrontmatterSchema = z.object({
title: z.string().optional(),
description: z.string().optional(),
cover: z.string().optional(),
校验失败时不会导致构建中断,而是降级使用默认值(标题取文件名,日期取空字符串),并在日志中输出警告。这个设计保证了即使 Frontmatter 写得不太规范,文章依然可以正常渲染。
string[]| 否 |
| 标签数组 |
cover | string | 否 | 封面图片 URL,显示在列表和详情页顶部 |
draft | boolean | 否 | 草稿标记,true 时默认不在列表中显示 |
| 草稿/隐藏 |
draft: true 默认过滤 |
_meta.json 分组 collapsed |
| 封面图 | cover 字段 | cover 字段 |
| SEO 描述 | description 字段 | description 字段 |