- 在该目录下,我们实现了一个脚本,用于自动生成侧边栏内容
import FastGlob from 'fast-glob';
const { glob } = FastGlob
import fs from 'fs/promises';
import path from 'path';
import type { DefaultTheme } from 'vitepress';
import chokidar from 'chokidar';
type SidebarConfig = Record<string, DefaultTheme.SidebarItem[]>;
export async function generateAutoSidebar(): Promise<SidebarConfig> {
const basePath = path.join(process.cwd(), 'doc/reviews');
const branches = await glob('*/', {
cwd: basePath,
onlyDirectories: true,
deep: 1
});
const sidebar: DefaultTheme.SidebarItem[] = [];
for (const branchDir of branches) {
const branchName = branchDir.replace(/\/$/, '');
const mdFiles = await glob(`${branchDir}/*.md`, {
cwd: basePath,
ignore: ['**/_*.md']
});
const items: DefaultTheme.SidebarItem[] = mdFiles
.map(file => {
const fileName = path.basename(file, '.md');
return {
text: `${fileName}.md`,
link: `/reviews/${branchDir}/${fileName}`
};
})
.sort((a, b) => {
const numA = parseInt(a.text.match(/\d+/)?.[0] || '0');
const numB = parseInt(b.text.match(/\d+/)?.[0] || '0');
return numA - numB;
});
sidebar.push({
text: branchName,
collapsed: false,
items
});
}
return { '/reviews/': sidebar };
}
export async function writeSidebarConfig(): Promise<void> {
const sidebarConfig = await generateAutoSidebar();
const configContent = `// Auto-generated sidebar config
import type { DefaultTheme } from 'vitepress';
export const sidebarConfig: DefaultTheme.Config['sidebar'] = ${JSON.stringify(sidebarConfig, null, 2)};
`;
var p = path.join(process.cwd(), 'doc/.vitepress/sidebar.generated.ts')
await fs.writeFile(
p,
configContent
);
}
writeSidebarConfig()
- 通过执行
tsx doc/.vitepress/utils/generateSidebar.ts --watch
,将在./doc/.vitepress/
目录下自动生成sidebar.generate.ts
文件,以上述reviews
文件夹中内容为例,生成的内容为:
import type { DefaultTheme } from 'vitepress';
export const sidebarConfig: DefaultTheme.Config['sidebar'] = {
"/reviews/": [
{
"text": "aaa",
"collapsed": false,
"items": [
{
"text": "1.md",
"link": "/reviews/aaa/1"
},
{
"text": "2.md",
"link": "/reviews/aaa/2"
}
]
},
{
"text": "bbb",
"collapsed": false,
"items": [
{
"text": "1.md",
"link": "/reviews/bbb/1"
}
]
}
]
};
- 而后,在我们的
config.mts
中引用即可import { defineConfig } from 'vitepress'
import { sidebarConfig } from './sidebar.generated.js';
export default defineConfig({
title: "coding",
description: "code review helper",
themeConfig: {
nav: [
{ text: 'Home', link: '/' },
{ text: 'Reviews', link: '/reviews' }
],
sidebar: sidebarConfig,
},
async buildEnd() {
const { writeSidebarConfig } = await import('./utils/generateSidebar.js');
await writeSidebarConfig();
}
})