- 在该目录下,我们实现了一个脚本,用于自动生成侧边栏内容
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();}
})