Skip to content

vitePress自动生成侧边栏目录

把记录的文章迁移到vitePress之后,有个想法,希望能够自动根据文章的目录结构自动生成侧边栏。初步的想法是在vitePress的配置文件运行时自动去读取目录并生成sideBar配置。

看了一下其他人提供的那些插件其实大同小异都是利用Node读取本地目录然后遍历生成目录。几行代码就搞定的事情那就不需要用别人的插件了吧。

实现的思路主要是几个步骤

以我的这个目录为例,我只需要简单生成目录,所以我只划分了两级目录,而且我希望每一个分类下都只看自己的目录文章。所以sideBar的目录结构大概如下:

javascript

sidebar: {
    '/posts/xxx': [
        {
            text: title,
            link: 路径
        }
    ]
}

文章的目录结构如下:

javascript
-posts
--分类
---分类下的文章.md
---分类下的文章2.md
--分类2
---分类2下的文章.md
---分类2下的文章2.md
  • 读取指定的目录获取文章的分类列表
  • 遍历分类列表生成每个分类下的文章目录列表
javascript
let parentDirName = '' //文章的根目录
let parentPath = path.join(__dirname,parentDirName)
fs.readdir(parentPath, (err, postDirFiles) => {
// 开始遍历一级分类
postDirFiles.map(childDirName => {
    // 得到一级目录路径
    let childPath = path.join(parentPath,childDirName)
    // 得到一级目录路径所有文件
    let childFiles = fs.readdirSync(childPath)
    // 生成子文件目录
    let items = childFiles.map(childFileName => {
        // 这里把文章的第一行当做了目录的标题
        let filePath = path.join(childPath, childFileName)
        let fileContent = fs.readFileSync(filePath, {encoding:'utf-8'})
        let title = fileContent.split('\n')[0].replace(/^\#\s+/,'')
        
        return {
            text: title, link: `/${parentDirName}/${childDirName}/${childFileName}`
        }
    })
})

当然这里是没有考虑目录下不是md文件这些情况的。根据自己需要再做改动。最终的代码可以参考vitepress/config.mts