一个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,'')
}

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

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

相关文章
|
2月前
|
JavaScript
Nest.js 实战 (十一):配置热重载 HMR 给服务提提速
这篇文章介绍了Nest.js服务在应用程序引导过程中,TypeScript编译对效率的影响,以及如何通过使用webpackHMR来降低应用实例化的时间。文章包含具体教程,指导读者如何在项目中安装依赖包,并在根目录下新增webpack配置文件webpack-hmr.config.js来调整HMR相关的配置。最后,文章总结了如何通过自定义webpack配置来更好地控制HMR行为。
|
17天前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
174 4
|
1月前
|
前端开发 JavaScript
JavaScript递归菜单栏
JavaScript递归菜单栏
JavaScript递归菜单栏
|
30天前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
137 0
|
2月前
|
JSON JavaScript 前端开发
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
|
2月前
|
JavaScript
Vue3基础(19)___vite.config.js中配置路径别名
本文介绍了如何在Vue 3的Vite配置文件`vite.config.js`中设置路径别名,以及如何在页面中使用这些别名导入模块。
81 0
Vue3基础(19)___vite.config.js中配置路径别名
|
3月前
|
移动开发 JavaScript 前端开发
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
这篇文章介绍了在UniApp H5项目中处理跨域问题的两种方法:通过修改manifest.json文件配置h5设置,或在项目根目录创建vue.config.js文件进行代理配置,并提供了具体的配置代码示例。
UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)
|
3月前
|
JSON 前端开发 JavaScript
vue.config.js配置详解
【8月更文挑战第16天】vue.config.js配置详解
62 1
vue.config.js配置详解
|
3月前
|
缓存 JavaScript 前端开发
|
3月前
|
JavaScript Windows
记一下 Windows11 安装与配置 node.js 的标准步骤
这篇文章记录了在Windows 11系统上安装和配置Node.js的步骤,包括安装Node.js、验证安装、配置npm、设置npm镜像加速、全局安装cnpm并配置镜像、解决TLS连接不安全警告的详细过程。
397 0