详细说明 iflux-art docs 站点中 _meta.json 配置文件的作用、格式、多级嵌套机制,以及标题优先级和侧边栏渲染逻辑。
Docs 站点的侧边栏导航不是自动生成的,而是通过每个目录下的 _meta.json 文件来配置。这套机制决定了侧边栏的显示名称、排列顺序和层级结构。
_meta.json 是一个放在内容目录中的 JSON 配置文件,每个目录最多放一个。它的核心作用有两个:
wsl2 → WSL 2 安装与通用配置指南)以点开头的目录(如
.obsidian)和_meta.json本身不会被纳入文档扫描。
最简单的 _meta.json 是一个扁平的键值对对象,键为目录名或文件名(不含扩展名),值为显示名称:
{ "ollama": "Ollama 快速入门", "docker": "Docker 快速入门"}对应目录结构:
local/ ├── _meta.json ├── ollama.md └── docker.md
侧边栏会将 ollama 显示为 "Ollama 快速入门",docker 显示为 "Docker 快速入门",且 ollama 排在 docker 前面。
Docs 支持任意层级的目录嵌套,每一层都可以有自己的 _meta.json。
以当前项目为例:
src/content/ ├── _meta.json ← 第 1 层:控制顶级分类 ├── index.mdx ├── grammar/ │ ├── _meta.json ← 第 2 层:控制 grammar 下的文档 │ ├── markdown.md │ └── ... ├── system/ │ ├── _meta.json ← 第 2 层:控制 system 下的文档 │ ├── linux.md │ └── ... ├── agent/ │ ├── _meta.json ← 第 2 层:控制 agent 下的子分类 │ ├── claude-code/ │ │ ├── _meta.json ← 第 3 层:控制 claude-code 下的文档 │ │ └── wsl2-cc.md │ └── hermes-agent/ │ ├── _meta.json ← 第 3 层:控制 hermes-agent 下的文档 │ ├── wsl2-hermes.md │ └── hermes-feishu.md └── local/ └── _meta.json ← 第 2 层:控制 local 下的文档
content/_meta.json 控制侧边栏最外层的分类入口:
{ "grammar": "语法基础", "system": "操作系统", "agent": "智能体", "local": "本地部署", "operation": "运营"}侧边栏会依次显示"语法基础"、"操作系统"、"智能体"、"本地部署"、"运营"五个顶级入口。
以 agent/_meta.json 为例,它控制"智能体"分类下的子项:
{ "hermes-agent": "Hermes Agent", "openclaw": "OpenClaw", "claude-code": "Claude Code"}这里的键 hermes-agent 和 claude-code 是目录名,openclaw 也是目录名。它们在侧边栏中作为可展开的子分类显示。
对于只包含文档文件不包含子目录的分类,如 system/_meta.json:
{ "linux": "Linux 发行版对比", "wsl2": "WSL 2 安装与通用配置指南", "arch": "WSL 2 安装 Arch Linux 完整指南"}这里的键都是 .md 文件名(不含扩展名),侧边栏直接显示为文档链接。
agent/hermes-agent/_meta.json 控制子分类下的具体文档:
{ "wsl2-hermes": "在 WSL 2 上安装 Hermes Agent", "hermes-feishu": "配置 Hermes Agent 连接飞书"}侧边栏显示的标题有明确的优先级,从高到低:
_meta.json 中配置的名称 — 最高优先级,无论是字符串还是对象中的 titletitle 字段以 grammar/markdown.md 为例,即使文件 frontmatter 中写了 title: Markdown 快速入门,侧边栏也会优先使用 _meta.json 中配置的 "markdown": "Markdown 快速入门"。
实际效果一致,但控制权不同
在当前项目中 _meta.json 的名称和 frontmatter 的 title 通常保持一致。但如果你想侧边栏显示一个简短名称、文章详情页显示完整标题,可以让两者不同。侧边栏标题由 _meta.json 控制,文章详情页标题由 frontmatter 控制。
如果某个目录或文件没有在 _meta.json 中列出,它仍然会出现在侧边栏中,只是行为如下:
| 情况 | 排序位置 | 显示名称 |
|---|---|---|
_meta.json 存在但未列出该项 | 排在所有已配置项之后 | 优先 frontmatter title,其次文件名 |
_meta.json 不存在 | 按文件系统默认顺序 | 优先 frontmatter title,其次文件名 |
也就是说,_meta.json 是可选的。不加也能正常工作,只是排序和命名不可控。
假设要在 grammar 分类下添加一个 typescript.md:
src/content/grammar/typescript.md 并编写内容src/content/grammar/_meta.json,在合适位置添加条目:{ "markdown": "Markdown 快速入门", "json": "JSON 快速入门", "typescript": "TypeScript 快速入门", "git": "Git 快速入门", "curl": "Curl 快速入门", "makefile": "Makefile 快速入门", "ssh": "SSH 快速入门", "vim": "Vim 快速入门", "regex": "正则表达式快速入门"}条目的位置决定了它在侧边栏中的排序位置。
假设要添加一个 database 分类:
src/content/database/src/content/database/ 下创建文档文件src/content/database/_meta.json:{ "mysql": "MySQL 快速入门", "redis": "Redis 快速入门"}src/content/_meta.json,添加新分类:{ "grammar": "语法基础", "system": "操作系统", "agent": "智能体", "local": "本地部署", "operation": "运营", "database": "数据库"}假设要在 agent 下添加一个 cursor 子分类:
src/content/agent/cursor/setup.mdsrc/content/agent/cursor/_meta.json:{ "setup": "Cursor 安装与配置"}src/content/agent/_meta.json,添加条目:{ "hermes-agent": "Hermes Agent", "cursor": "Cursor", "openclaw": "OpenClaw", "claude-code": "Claude Code"}_meta.json 中的键名必须与文件名或目录名完全匹配(不含扩展名)。文件名 wsl2-cc.md 对应的键是 wsl2-cc,目录名 hermes-agent 对应的键是 hermes-agent。大小写敏感。
如果某篇文档不想出现在侧边栏中,有两种方式:
display: hidden_meta.json 中列出(但这种方式下文档仍可能在其他地方被访问到)如果存在 agent/claude-code.md 文件和 agent/claude-code/ 目录同时存在,构建时会优先保留文档文件,目录会被忽略。避免这种命名冲突。
_meta.json 必须是合法的 JSON 格式。注意以下常见错误: