UNPKG

@modern-js/doc-tools-doc

Version:

Website for @modern-js/doc-tools

250 lines (202 loc) 6.17 kB
# 自动化导航栏/侧边栏 在 Modern.js Doc 中,除了在配置文件中通过 `themeConfig` 声明 [nav](/api/config/config-theme.html#nav) 和 [sidebar](/api/config/config-theme.html#sidebar), 你也可以通过声明 `_meta.json` 描述文件来自动化生成导航栏和侧边栏,我们更加推荐后者,因为可以使配置文件更加简洁和清晰 :::tip 提示 当配置文件 `modern.config.ts` 中没有 `nav` 和 `sidebar` 配置的情况下,自动化导航栏/侧边栏才会生效 ::: ## 基础概念 首先,`_meta.json` 可以分为两类:导航栏级别和侧边栏级别两者的区别在于,导航级别的 `_meta.json` 位于文档根目录中,而侧边栏级别的 `_meta.json` 位于文档根目录的子目录中比如: ```js docs ├── _meta.json // 导航栏级别 └── guides ├── _meta.json // 侧边栏级别 ├── introduction.mdx └── advanced ├── _meta.json // 侧边栏级别 └── plugin-development.md ``` 如果你的文档使用了国际化,那么导航栏级别的 `_meta.json` 会放置在对应语言目录下,比如: ```js docs ├── en ├── _meta.json // 导航栏级别 └── guides ├── _meta.json // 侧边栏级别 ├── introduction.mdx ├── install.mdx └── advanced ├── _meta.json // 侧边栏级别 └── plugin-development.md └── zh ├── _meta.json // 导航栏级别 └── guides ├── _meta.json // 侧边栏级别 ├── introduction.mdx ├── install.mdx └── advanced ├── _meta.json // 侧边栏级别 └── plugin-development.md ``` ## 导航栏级别配置 在导航栏级别的情况中,你可以在 `_meta.json` 中填入一个数组,其类型跟默认主题的 nav 配置完全一致,详情可以参考[nav 配置](/api/config/config-theme.html#nav)比如: ```json [ { "text": "Guide", "link": "/guides/introduction", "activeMatch": "^/guides/" } ] ``` ## 侧边栏级别配置 在侧边栏级别的情况中,你可以在 `_meta.json` 中填入一个数组,数组每一项的类型如下: ```ts export type SideMetaItem = | string | { type: 'file'; name: string; label?: string; } | { type: 'dir'; name: string; label?: string; collapsible?: boolean; collapsed?: boolean; }; ``` ### string 当类型为 `string` 时,表示该项是一个文件,文件名为该字符串,比如: ```json ["introduction"] ``` 其中文件名可以带后缀,也可以不带后缀,比如 `introduction` 会被解析为 `introduction.mdx` ### obejct 当类型为对象形式时,你可以描述为一个文件目录或者自定义链接 在描述**文件**的情况下,类型如下: ```ts { type: 'file'; name: string; label?: string; } ``` 其中,`name` 表示文件名,同时支持`带`/`不带`后缀,`label` 表示该文件在侧边栏中的显示名称,为可选值,如果未填则会自动取文档中的 h1 标题比如: ```json { "type": "file", "name": "introduction", "label": "Introduction" } ``` 在描述**目录**的情况下,类型如下: ```ts { type: 'dir'; name: string; label: string; collapsible?: boolean; collapsed?: boolean; } ``` 其中,`name` 表示目录名,`label` 表示该目录在侧边栏中的显示名称,`collapsible` 表示该目录是否可以折叠,`collapsed` 表示该目录是否默认折叠,比如: ```json { "type": "dir", "name": "advanced", "label": "Advanced", "collapsible": true, "collapsed": false } ``` 在描述**自定义链接**的情况下,类型如下: ```ts { type: 'custom-link'; label: string; link: string; } ``` 其中,`label` 表示该链接在侧边栏中的显示名称,`link` 表示该链接的跳转地址,比如: ```json { "type": "custom-link", "label": "My Link", "link": "/my-link" } ``` `link` 支持外部链接,比如: ```json { "type": "custom-link", "link": "https://github.com", "label": "GitHub" } ``` ### 完整示例 下面是一个完整的示例,用到了上述的三种类型: ```json [ "install", { "type": "file", "name": "introduction", "label": "Introduction" }, { "type": "dir", "name": "advanced", "label": "Advanced", "collapsible": true, "collapsed": false }, { "type": "custom-link", "label": "My Link", "link": "/my-link" } ] ``` ### 无配置用法 某些目录下你可以不配置 `_meta.json`,让框架自动帮你生成侧边栏这需要保证目录下**仅包含文档,而不包含子目录**,并且你对**文档的顺序**没有要求比如现在有如下的文档结构: ```bash docs ├── _meta.json └── guides ├── _meta.json └── basic ├── introduction.mdx ├── install.mdx └── plugin-development.md ``` 在 `guides` 目录中你可以配置 `_meta.json` 内容如下: ```json [ { "type": "dir", "name": "basic", "label": "Basic", "collapsible": true, "collapsed": false } ] ``` 而在 `basic` 目录中,你可以不配置 `_meta.json`,框架会自动帮你生成侧边栏,默认按照文件名的字母顺序排序如果你想要自定义顺序,可以在文件名前加上数字前缀,比如: ```bash basic ├── 1-introduction.mdx ├── 2-install.mdx └── 3-plugin-development.md ``` ### 标题前添加 svg 图标 此外,你还可以通过 `tag` 配置在标题前添加图标,比如: ```json title="_meta.json" { "type": "file", "name": "introduction", "label": "Introduction", "tag": "<svg width=\"1em\" height=\"1em\" viewBox=\"0 0 32 32\"><path fill=\"currentColor\" d=\"M4 6h24v2H4zm0 18h24v2H4zm0-12h24v2H4zm0 6h24v2H4z\"/></svg>" } ``` `tag` 的值为 svg 标签字符串或者图片 URL,你可以将其配置到**导航栏**或者**侧边栏**