自动生成侧边栏
道格龙(Docusaurus)可以根据你的文件系统结构来自动创建一个侧边栏:每个文件夹创建一个侧边栏分类,每个文件创建一个文档链接。
type SidebarItemAutogenerated = {
type: 'autogenerated';
dirName: string; // 用于生成侧边栏切片的源文件夹(相对于 docs 目录)
};
道格龙(Docusaurus)可以从你的 docs
文件夹中生成一个完整的侧边栏:
export default {
myAutogeneratedSidebar: [
{
type: 'autogenerated',
dirName: '.', // '.' 表示当前的 docs 文件夹
},
],
};
一个 autogenerated
项目会被道格龙(Docusaurus)转换成一个侧边栏切片(在分类简写中也讨论过):一个由 doc
或 category
类型的项目组成的列表。因此,你可以在一个侧边栏层级中,将来自多个目录的多个 autogenerated
项目与常规的侧边栏项目穿插拼接在一起。
一个实际示例子
考虑以下文件结构:
docs
├── api
│ ├── product1-api
│ │ └── api.md
│ └── product2-api
│ ├── basic-api.md
│ └── pro-api.md
├── intro.md
└── tutorials
├── advanced
│ ├── advanced1.md
│ ├── advanced2.md
│ └── read-more
│ ├── resource1.md
│ └── resource2.md
├── easy
│ ├── easy1.md
│ └── easy2.md
├── tutorial-end.md
├── tutorial-intro.md
└── tutorial-medium.md
并假设每个文档的 ID 就是其文件名。如果你定义一个自动生成的侧边栏,如下所示:
export default {
mySidebar: [
'intro',
{
type: 'category',
label: '教程',
items: [
'tutorial-intro',
{
type: 'autogenerated',
dirName: 'tutorials/easy', // 从 docs/tutorials/easy 生成侧边栏切片
},
'tutorial-medium',
{
type: 'autogenerated',
dirName: 'tutorials/advanced', // 从 docs/tutorials/advanced 生成侧边栏切片
},
'tutorial-end',
],
},
{
type: 'autogenerated',
dirName: 'api', // 从 docs/api 生成侧边栏切片
},
{
type: 'category',
label: '社区',
items: ['team', 'chat'],
},
],
};
它将被解析为:
export default {
mySidebar: [
'intro',
{
type: 'category',
label: '教程',
items: [
'tutorial-intro',
// docs/tutorials/easy 目录下的两个文件
'easy1',
'easy2',
'tutorial-medium',
// docs/tutorials/advanced 目录下的两个文件和一个文件夹
'advanced1',
'advanced2',
{
type: 'category',
label: 'read-more',
items: ['resource1', 'resource2'],
},
'tutorial-end',
],
},
// docs/api 目录下的两个文件夹
{
type: 'category',
label: 'product1-api',
items: ['api'],
},
{
type: 'category',
label: 'product2-api',
items: ['basic-api', 'pro-api'],
},
{
type: 'category',
label: '社区',
items: ['team', 'chat'],
},
],
};
请注意,自动生成的源目录本身并不会成为分类:只有它们包含的项目才会。这就是我们所说的"侧边栏切片"。
分类索引页约定
道格龙(Docusaurus)可以自动将一个分类链接到其索引文档。
分类索引文档是遵循以下任一命名约定的文档:
- 名为
index
(不区分大小写):docs/Guides/index.md
- 名为
README
(不区分大小写):docs/Guides/README.mdx
- 与父文件夹同名:
docs/Guides/Guides.md
这等同于使用一个带有文档链接的分类:
export default {
docs: [
{
type: 'category',
label: '指南',
link: {type: 'doc', id: 'Guides/index'},
items: [],
},
],
};
将你的介绍性文档命名为 README.md
,可以使其在使用 GitHub 界面浏览文件夹时显示出来;而使用 index.md
则使其行为更符合 HTML 文件的服务方式。
如果一个文件夹中只有一个索引页,它将被转换成一个链接而不是一个分类。这对于资源归类非常有用:
some-doc
├── index.md
├── img1.png
└── img2.png
自定义分类索引匹配
可以退出任何分类索引约定,或者定义更多的约定。你可以通过 sidebarItemsGenerator
回调注入你自己的 isCategoryIndex
匹配器。例如,你也可以选择 intro
作为另一个符合自动成为分类索引条件的文件名。
export default {
plugins: [
[
'@docusaurus/plugin-content-docs',
{
async sidebarItemsGenerator({
...args,
isCategoryIndex: defaultCategoryIndexMatcher, // 默认的匹配器实现,如下所示
defaultSidebarItemsGenerator,
}) {
return defaultSidebarItemsGenerator({
...args,
isCategoryIndex(doc) {
return (
// 除了默认的,也选择 intro.md
doc.fileName.toLowerCase() === 'intro' ||
defaultCategoryIndexMatcher(doc)
);
},
});
},
},
],
],
};
或者选择不使用任何分类索引约定。
export default {
plugins: [
[
'@docusaurus/plugin-content-docs',
{
async sidebarItemsGenerator({
...args,
isCategoryIndex: defaultCategoryIndexMatcher, // 默认的匹配器实现,如下所示
defaultSidebarItemsGenerator,
}) {
return defaultSidebarItemsGenerator({
...args,
isCategoryIndex() {
// 没有文档会被自动选为分类索引
return false;
},
});
},
},
],
],
};
isCategoryIndex
匹配器将被提供三个字段:
fileName
:文件的名称,不含扩展名,大小写保留。directories
:从最低级到最高级的目录名称列表,相对于文档根目录。extension
:文件的扩展名,以“.”开头。
例如,对于一个位于 guides/sidebar/autogenerated.md
的文档文件,匹配器接收到的 属性(props) 是:
const props = {
fileName: 'autogenerated',
directories: ['sidebar', 'guides'],
extension: '.md',
};