一个vuepress配置问题,引发的JS递归思考

简介: 这两天在尝试用语雀+vuepress+github 搭建个人博客。配置过程中遇到一个递归函数问题。。。

前言

这两天在尝试用语雀+vuepress+github 搭建个人博客。

语雀作为编辑器,发布文档推送github,再自动构建vuepress,部署个人站点、或者gitpage,大概流程如下。

问题

我使用的elog插件批量导出语雀文档。elog采用的配置是所有文章平铺导出,没有按照语雀知识库目录生成markdown,这导致vuepress侧边栏无法和语雀一致,如下图。

上图,左侧是语雀知识库,右侧是导出到vuepress展示的效果,很明显没有目录这很影响阅读体验呀

解决

在查阅vuepress文档后,发现配置silderbar.ts可以自定义侧边栏目录,配置参数如下:

export default {
  theme: defaultTheme({
    // 可折叠的侧边栏
    sidebar: {
      '/web/': [
        {
          text: '王天的web进阶手册',
          collapsible: true,// 目录是否折叠
          children: ['/reference/cli.md', '/reference/config.md'],// 文档目录
        },
        {
          text: '王天的魔法工具箱',
          collapsible: true,
          children: ['/reference/bundler/vite.md', '/reference/bundler/webpack.md'],
        },
      ],
    },
  }),
}

递归生成菜单

配置sidebar.ts 可以修改左侧菜单,但是一个个手动修改这忒麻烦了啊啊啊啊。那如何批量生产菜单配置项呢?

递归函数呀呀呀呀呀呀  🔥🔥🔥🔥

elog 在同步语雀文档时,会自动创建elog.cache.json缓存文件,在vueprss项目根目录中查看。

打开elog.cache.json文件,我们能看到语雀文档知识库的数据结构

"catalog": [
    {
      "type": "DOC",
      "title": "前言",
      "uuid": "17Os-_V_hcS37KOD",
      "url": "wqbpyf5083qc7ho8",
      "prev_uuid": "",
      "sibling_uuid": "dmQSRn6AXUBSg96x",
      "child_uuid": "",
      "parent_uuid": "",
      "doc_id": 141216125,
      "level": 0,
      "id": 141216125,
      "open_window": 1,
      "visible": 1
    },
    {
      "type": "TITLE",
      "title": "项目",
      "uuid": "dmQSRn6AXUBSg96x",
      "url": "",
      "prev_uuid": "17Os-_V_hcS37KOD",
      "sibling_uuid": "PUQZiYfEh8WLE0S5",
      "child_uuid": "p8CdcJ3Wge274g-C",
      "parent_uuid": "",
      "doc_id": "",
      "level": 0,
      "id": "",
      "open_window": 1,
      "visible": 1
    },
    {
      "type": "TITLE",
      "title": "小天省钱宝",
      "uuid": "p8CdcJ3Wge274g-C",
      "url": "",
      "prev_uuid": "dmQSRn6AXUBSg96x",
      "sibling_uuid": "Nwy1XwBVCauDEVT3",
      "child_uuid": "B_g_9VbzBNLx6MBi",
      "parent_uuid": "dmQSRn6AXUBSg96x",
      "doc_id": "",
      "level": 1,
      "id": "",
      "open_window": 1,
      "visible": 1
    },
    {
      "type": "DOC",
      "title": "猎人",
      "uuid": "B_g_9VbzBNLx6MBi",
      "url": "buh3gviq8r2v4kxe",
      "prev_uuid": "p8CdcJ3Wge274g-C",
      "sibling_uuid": "",
      "child_uuid": "",
      "parent_uuid": "p8CdcJ3Wge274g-C",
      "doc_id": 141216121,
      "level": 2,
      "id": 141216121,
      "open_window": 1,
      "visible": 1
    },
  ]

catlog属性是文档缓存数据,关键字段:

  • type:值为'DOC' 是文章、值为TITLE 则为目录
  • uuid:文章id
  • prent_uuid:父节点的uuid

咱们根据以上参数,编写递归函数, 将elog.cache.json的一维数组,递归生成vuepress 侧边栏配置数据

代码如下:

function genYuqueRoute() {
  // 参数1:遍历数组
  // 参数2:父菜单id
  const deep = (arrlist,parantId) => {
    let forList:any[] = []
    arrlist.forEach(element => {
      // 菜单id不一致,跳出循环调用
      if(element.parent_uuid !== parantId) return
      // 如果是TITLE类型新增配置项
      if(element.type === 'TITLE'){
          forList.push({
            text:element.title,
            collapsible:true,
            children:deep(arrlist,element.uuid)
          })
        // 如果是DOC 类型追加文件地址 
      }else{
          forList.push(element.url+'.md')    
        }
    }); 
    return forList 
  }
   return deep(catalog,'')
}

递归函数本质上是一个在回调自身的函数,用于改造数据结构,

重点在于跳出循环的机制,否则陷入死循环啦

相关文章
|
3月前
|
编解码 前端开发 JavaScript
js react antd 实现页面低分变率和高分变率下字体大小自适用,主要是配置antd
在React中结合Ant Design与媒体查询,通过less变量和响应式断点动态调整`@font-size-base`,实现多分辨率下字体自适应,提升跨设备体验。
139 2
|
6月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
268 19
|
9月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
7649 23
|
JavaScript
Nest.js 实战 (十一):配置热重载 HMR 给服务提提速
这篇文章介绍了Nest.js服务在应用程序引导过程中,TypeScript编译对效率的影响,以及如何通过使用webpackHMR来降低应用实例化的时间。文章包含具体教程,指导读者如何在项目中安装依赖包,并在根目录下新增webpack配置文件webpack-hmr.config.js来调整HMR相关的配置。最后,文章总结了如何通过自定义webpack配置来更好地控制HMR行为。
265 0
Nest.js 实战 (十一):配置热重载 HMR 给服务提提速
|
9月前
|
Prometheus 监控 JavaScript
Node.js连接池配置的五个隐形陷阱与防御体系:从创业公司血泪史说起
文章以创业公司血泪史为例,详细阐述了 Node.js 连接池配置的五个隐形陷阱及防御体系。包括连接泄漏、配置参数算术错误、异步异常导致崩溃、跨连接事务问题、监控缺失,并介绍了相应的解决办法和终极防御手段,强调在确定性与不确定性中寻找平衡,建立自适应机制。
361 13
|
8月前
|
JavaScript 前端开发 测试技术
|
前端开发 JavaScript
JavaScript递归菜单栏
JavaScript递归菜单栏
JavaScript递归菜单栏
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
2383 4
|
JavaScript
Vue3基础(19)___vite.config.js中配置路径别名
本文介绍了如何在Vue 3的Vite配置文件`vite.config.js`中设置路径别名,以及如何在页面中使用这些别名导入模块。
623 0
Vue3基础(19)___vite.config.js中配置路径别名
|
移动开发 JavaScript 前端开发
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
这篇文章介绍了在UniApp H5项目中处理跨域问题的两种方法:通过修改manifest.json文件配置h5设置,或在项目根目录创建vue.config.js文件进行代理配置,并提供了具体的配置代码示例。
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)

热门文章

最新文章