vitepress(三):自动生成目录

news2024/10/6 10:26:31

上一节我们将自己的网站发布到了git pages上,但是现在我们需要每次更新一篇文章就重写一次目录,操作上十分的繁琐和不方便,所以我们需要一个方法去自动生成我们的侧边栏结构,方便我们每次只需要更新我们的项目即可。这里我们要知道一个点:

因为 VitePress 应用在生成静态构建时是通过 Node.js 服务端渲染的,所以我们可以使用Node.js的相关函数来获取我们的目录结构,再通过目录结构来生成我们的目录

获取目录结构

首先我们引入node的path模块

const path = require("path");

通过使用如下的函数获取指定目录下的文件结构,比如下面的例子是获取articles的other文件夹下面的结构

path.resolve(__dirname, "../articles/other"),

之后我们引入directory-tree这个库(需要先npm安装),他会帮我们把传入的目录下的文件解析的指定的格式方便我们处理,同时处理时我们仅需要留下md格式的文件即可,所以我们配置extensions过滤文件格式

const srcDir = dirTree(srcPath, {
    extensions: /\.md$/,
    normalizePath: true,
  });

我们在控制台打印一下,可以看到,解析后我们的得到的数据是这样的:

{
  path: 'C:/Users/10168/Desktop/learn/vitepress/aiai0603.github.io/docs/articles/other',
  name: 'other',
  children: [
    {
      path: 'C:/Users/10168/Desktop/learn/vitepress/aiai0603.github.io/docs/articles/other/vitepress',
      name: 'vitepress',
      children: [Array]
    }
  ]
}

生成侧边栏

我们需要的是other这个文件夹下面的部分。但是我们不知道他有几个子文件夹,所以我们需要通过一个递归函数来解决这个问题:这个函数的逻辑是这样的,首先做类型校验,我们需要传入一个数组(必须是数组,否则就乱了),之后判断数组的每一项是不是有children属性,那么把它的children传入继续递归,并且设置其菜单的其他属性(比如能否展开等);如果没有,那么其可能是空的文件夹或者md文件,使用函数将可能是md文件的.md结尾去掉,再将路径path从docs开始截断(注意路径是从docs文件夹开始写的绝对路径,不能写成是相对路径的方式),传入link属性中,作为我们的访问路径。

function toSidebarOption(tree = []) {
  if (!Array.isArray(tree)) return [];

  return tree.map((v) => {
    if (v.children !== undefined) {
      return {
        text: v.name,
        collapsible: true,
        collapsed: true,
        items: toSidebarOption(v.children),
      };
    } else {
      return {
        text: v.name.replace(".md", ""),
        link: v.path.split("docs")[1].replace(".md", ""),
      };
    }
  });
}

这个时候注意到一个问题,比如说我的文件夹叫做a,但是我希望在侧边栏中,它叫做b,怎么办,很简单,我们稍微修改一下我们的传入函数,拓展它自定义目录名称的能力就行了,设置title属性,如果我们传入的title那么我们按照title生成目录,最后的函数如下:

function autoGetSidebarOptionBySrcDir(srcPath, title) {
  const srcDir = dirTree(srcPath, {
    extensions: /\.md$/,
    normalizePath: true,
  });


  return [
    {
      text: title == undefined ?  srcDir.name : title ,
      collapsible: true,
      collapsed: true,
      items: toSidebarOption(srcDir.children),
    },
  ];

}

调用函数

我们将写好的两个函数放在一个文件里,然后导出模块,在config.js里引用它,我们就可以用它配置侧边栏,比如说,我们通过如下的调用形式就把"/articles/basic"的侧边栏配置好了:

 sidebar: {
      "/articles/basic": autoGetSidebarOptionBySrcDir(
        path.resolve(__dirname, "../articles/basic"),
        "基础课"
      ),
 }

当然如果你的侧边栏中有多个项的话,比如说你在other下面想放上多个文件夹,那么使用concat来连接数组就行了,比如下面这样:

autoGetSidebarOptionBySrcDir(
        path.resolve(__dirname, "../articles/basic"),
        "基础课"
      ).concat(autoGetSidebarOptionBySrcDir(
        path.resolve(__dirname, "../articles/basic"),
        "基础课"
      ))

ok,我们来看看效果,这是用我们的函数生成侧边栏:

这样编写的好处在于:

  1. 我们可以更新后让系统自动给我们配置目录

  2. 同时你也可以把资料放在不同的位置但是生成在一个侧边下方,完全根据你的喜好来配置

当然这个demo也有不足,完整的DEMO在我的github中,

可以访问 https://github.com/aiai0603/aiai0603.github.io 来获取

在下一篇中我将讲述这么在vitepress中引入vue的内容,敬请关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日一题】【LeetCode】【第六天】【Python实现】加一

加一的解决之路 题目描述 测试案例(部分) 第一次 1这个很好理解,唯一的难点就是个位1导致的进位的问题,可能会只会导致十位1,也有像8999这样产生多次进位的情况。 为了解决进位问题,自己想到了第三天学…

mysql三表查询15个例子带你搞懂它

mysql三表查询30个经典案例创建三个表a、b、c表a中的数据表b中的数据表c中的数据1.查询出学习成绩70分以上的学生姓名与成绩与学科;2.查询姓名以mi结尾的学生姓名及其任课老师姓名;3.选修课名为math的学生学号与姓名;4.选修课号为C4的学生学号&#xff1…

QEMU调试Linux内核环境搭建

一个最小可运行Linux操作系统需要内核镜像bzImage和rootfs,本文整理了其制作、安装过程,调试命令,以及如何添加共享磁盘。编译内核源码从 The Linux Kernel Archives 网站下载内核源码,本文下载的版本为4.14.191,4.14.…

危险程度(并查集)

有 nn 种化学物质,编号 1∼n1∼n。 其中,有 mm 对物质之间会发生反应。 现在,要将这些化学物质逐个倒入同一个试管之中,具体倒入顺序不限。 我们需要计算一下试管的危险值。 已知,空试管的危险值为 11,…

【UE4 第一人称射击游戏】21-添加动态扩散准心

素材资料地址:链接:https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg密码:jlhr上一篇:【UE4 第一人称射击游戏】20-添加瞄准十字线本篇效果:步骤:将资源移至FPS项目文件夹内移入后发现多了一个名为“WBCro…

【web安全】——报错注入

作者名:Demo不是emo主页面链接: 主页传送门创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

如何查看sqlite数据库的 .db文件中的表的内容数据

在使用 qt 的sqlite 数据的时候,对于创建的数据库的 .db 文件的内容的查看我们可以按照下面的步骤安装工具进行查看 下载所需的sqlite 查看工具 下载:链接:https://pan.baidu.com/s/1KSl9w61zaEyemhR1Ir04_A 提取码:6666 只需要解压即可,其中安装包内…

MINISForum HX90 主机风扇调教

今年秋天买了个1个HX90 5900H的mini主机。准系统版本,2899元。 但是买回来之后,发现它的风扇声音实在是大,稍微一加载点东西,就 开始呜呜的响,简直让人心烦 意乱。 去了官网查看。好多人的解决办法看了没看明白&…

【机器学习】PR曲线F1评分ROC曲线AUC

参考:《百面机器学习》 PR曲线 TP( True Positive):真正例 FP( False Positive):假正例 FN(False Negative):假反例 TN(True Negative&#xff0…

基于imx6ull配置开发环境

1. 交叉编译链背景:因为在原子的教程中有强调最新的Linaro gcc编译完uboot后无法运行的问题,所以原子采用4.9,那我们就沿用下。Linaro gcc有两个版本: gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf.tar.tar.xz 和 gcc-linaro-4.9.4-20…

linux反弹备忘录

如果你有幸在渗透测试中发现了命令执行漏洞,那么不久之后你可能需要一个交互式shell。如果无法添加新帐户/ SSH密钥/ .rhosts文件并登录,则下一步可能是拖回反向shell或将shell绑定到TCP端口。 本页讨论前者。创建反向 shell 的选项受到目标系统上安装的…

【阶段三】Python机器学习05篇:机器学习项目实战:逻辑回归模型

本篇的思维导图: 要对离散变量进行预测,则要使用分类模型。分类模型与回归模型的区别在于其预测的变量不是连续的,而是离散的一些类别,例如,最常见的二分类模型可以预测一个人是否会违约、客户是否会流失、肿瘤是良性还是恶性等。逻辑回归模型虽然名字中有“回归…

Neural-Pull曲面重建程序配置

前几天一篇曲面重建文章的审稿意见回来了,要求加近三年对比方法。在github上搜了一些项目,大部分的环境都很难配置成功。最后找了一个ICML2021年的点云重建项目[1]作为实验对比。 项目链接:mabaorui/NeuralPull-Pytorch 整体来说&#xff0…

SpringBoot 多种方式配置错误页面

参考资料 SpringBoot异常处理机制-BasicErrorController与ControllerAdviceJava开发从工作到原理–BasicErrorController统一异常处理【spring boot】spring boot 处理异常SpringBoot一个请求的处理全过程ControllerAdvice和ErrorPageRegistrar接口配置错误页面的问题SpringBo…

【Linux操作系统】自动化编译make和Makefile

文章目录一.make/makefile简介1.什么是make,makefile?2.为什么要有make/makefile?二.makefile文件规则1.基本规则2.举一个例子3.伪目标4.其他规则三.文件三个时间问题-make程序1.三个时间何时更新2.touch的两个作用3.make程序如何知道依赖文件是否更新?一.make/makefile简介…

手写Srping11(实现AOP切面)

文章目录目标设计项目结构一、代理方法的案例二、代理方法案例拆解实现1、切点表达式——Pointcut2、类匹配器——ClassFilter3、方法匹配器——MethodMatcher4、实现切点表达式类——AspectJExpressionPointcut4.1、匹配验证5、包装切面信息——AdvisedSupport5.1、被代理的目…

Zynq PS之MIO、EMIO调试

目录 原理框图 Vivado中添加&配置Zynq UltraScale MPSoc IP UART设置(仅用于调试,非必需) MIO、EMIO设置 DDR配置 执行Generate Output Products 执行Create HDL Wrapper 执行File -> Export ->Export Hardware 执行Launch S…

Springboot中配置文件application.yaml的位置

文章目录位置一:整个项目的config包下位置二:整个项目的根目录下位置三:resources文件夹下config包中位置四:resources文件夹下四个位置的优先级位置一:整个项目的config包下 前些天发现了一个巨牛的人工智能学习网站&…

SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段

文章目录1.查询时的普遍写法2.问题分析2.1 计算负担2.2 IO负担2.3 覆盖索引失效2.4 缓存压力3.总结1.查询时的普遍写法 select * from the_table_name where ...2.问题分析 2.1 计算负担 数据库需要去解析更多的对象字段、权限、属性,查询数据字典将"*"…

dp刷题(二)分割回文串(详细推导+O(N^3)=>O(N^2)优化)

目录 分割回文串-ii_牛客题霸_牛客网 ​编辑 描述 示例1 思路 状态F(i):即为第i个字符时所需要切割的最小次数 状态转移方程:F(i) min(F(i), F(j)1) 优化: 注意点 分割回文串-ii_牛客题霸_牛客网 描述 给出一个字符串s&#xff0…