UNPKG

vitepress-auto-nav

Version:

Auto-generate navigation and sidebar configuration for VitePress

256 lines (190 loc) 7.35 kB
# VitePress 自动导航与侧边栏生成器 `vitepress-auto-nav` 是一个用于自动生成 VitePress 导航栏和侧边栏配置的工具,可以根据文档目录结构自动创建导航和侧边栏,无需手动配置。 ## 安装 ```bash npm install vitepress-auto-nav --save-dev # 或 yarn add vitepress-auto-nav --dev # 或 pnpm add vitepress-auto-nav -D ``` ## 基本使用 在 VitePress 配置文件中导入并使用: ```js // .vitepress/config.js 或 .vitepress/config.ts const { default: generateVitepressConfig } = require('vitepress-auto-nav') // 或使用 ES 模块语法 // import generateVitepressConfig from 'vitepress-auto-nav'; export default { // ...其他配置 themeConfig: { // 使用自动生成的导航和侧边栏 ...generateVitepressConfig(), }, } ``` ## 文档目录自动检测 工具会按以下顺序自动检测您的文档目录: 1. `src/docs` - 首先检查 2. `docs` - 如果 src/docs 不存在则检查此目录 3. 当前目录 (`.`) - 作为后备选项 您可以通过 `docsDir` 选项来覆盖自动检测结果。 ## 配置选项 可以通过选项自定义生成行为: ```js import generateVitepressConfig from 'vitepress-auto-nav' export default { // ...其他配置 themeConfig: { ...generateVitepressConfig({ // 文档根目录,默认自动检测 (src/docs, docs, 或当前目录) docsDir: 'docs', // 是否默认展开侧边栏,默认为 true defaultExpand: true, // 要忽略的目录 ignoreDirs: ['public', 'assets', 'node_modules', 'api'], // 概述文件的后缀名称 overviewSuffix: '概述', // 自定义显示名称格式化函数 formatDisplayName: name => { // 示例:将 kebab-case 转换为标题式大小写 return name.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) }, // 自定义侧边栏项目排序函数 sidebarItemSorter: (a, b) => { // 示例:保持概述在顶部,然后按字母顺序排序 if (a.text && a.text.includes('概述')) return -1 if (b.text && b.text.includes('概述')) return 1 return a.text && b.text ? a.text.localeCompare(b.text) : 0 }, // 启用调试日志 debug: false, // 目录遍历的最大深度 (1, 2, 或 3) maxDepth: 3, // 是否包含文档根目录中的文件 includeRootFiles: false, // 要包含的文件模式(仅匹配这些扩展名的文件) filePatterns: ['.md'], }), }, } ``` ## 高级配置详解 ### 文档结构深度控制 `maxDepth` 选项控制工具遍历目录结构的深度: - `maxDepth: 1` - 仅处理一级目录(例如,`/guides/`) - `maxDepth: 2` - 处理到二级目录(例如,`/guides/basics/`) - `maxDepth: 3` - 处理到三级目录(默认值,例如,`/guides/basics/installation/`) ### 自定义显示名称格式化 您可以完全自定义目录和文件名在导航和侧边栏中的显示方式: ```js formatDisplayName: name => { // 移除常见前缀如 "01-", "02-" 等 name = name.replace(/^\d+[-_]/, '') // 添加您自己的格式化逻辑 return name.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) } ``` ### 自定义侧边栏项目排序 使用自定义排序函数控制侧边栏项目的顺序: ```js sidebarItemSorter: (a, b) => { // 首先,按自定义顺序排序 const order = ['介绍', '入门', '配置', '高级'] // 获取不带路径的基本名称 const aName = a.link ? a.link.split('/').pop() : '' const bName = b.link ? b.link.split('/').pop() : '' // 在自定义顺序数组中查找位置 const aIndex = order.findIndex(item => aName && aName.includes(item)) const bIndex = order.findIndex(item => bName && bName.includes(item)) // 如果两个项目都在自定义顺序中 if (aIndex !== -1 && bIndex !== -1) { return aIndex - bIndex } // 将自定义顺序中的项目放在其他项目之前 if (aIndex !== -1) return -1 if (bIndex !== -1) return 1 // 对其余项目进行默认的字母顺序排序 return a.text && b.text ? a.text.localeCompare(b.text) : 0 } ``` ## 单独使用导航栏或侧边栏 也可以单独使用导航栏或侧边栏生成功能: ```js import { generateNav, generateSidebar } from 'vitepress-auto-nav' export default { // ...其他配置 themeConfig: { // 使用自动生成的导航 nav: generateNav({ maxDepth: 2, includeRootFiles: true, }), // 使用自动生成的侧边栏,并与手动配置混合 sidebar: { ...generateSidebar({ // 如果要设置侧边栏不默认展开,需要在这里传入参数 defaultExpand: false, // 只包含 markdown 文件 filePatterns: ['.md'], }), // 手动添加或覆盖特定路径的侧边栏 '/custom/path/': [ { text: '自定义部分', items: [{ text: '文档1', link: '/custom/path/doc1' }], }, ], }, }, } ``` ## 自动生成规则 ### 目录结构示例 ``` docs/ ├── Web开发/ # 一级目录 → 导航栏主菜单项 │ ├── 前端/ # 二级目录 → 下拉菜单分组标题 │ │ ├── Vue/ # 三级目录 → 导航项和侧边栏分组 │ │ │ ├── index.md # 生成概述链接 │ │ │ ├── 基础语法.md # 侧边栏子项 │ │ │ └── 高级特性.md # 侧边栏子项 ``` ### 生成规则 1. **导航栏生成规则**: - 一级目录 → 导航栏主菜单项 - 二级目录 → 下拉菜单分组标题 - 三级目录 → 导航项(导航至 index.md) 2. **侧边栏生成规则**: - 三级目录 → 可折叠分组标题 - 三级目录下的 .md 文件 → 侧边栏子项 - index.md 会被特殊处理为"[目录名]概述" 3. **路径格式**: - 保留原始目录名的大小写格式 - 不对目录名做特殊处理 - 使用原始路径名拼接 4. **智能过滤**: - 忽略以 `_` 开头的目录 - 自动跳过没有 index.md 的三级目录 - 忽略 public、assets 等特殊目录(可自定义) ## 故障排除 ### 找不到文档目录问题 如果您看到"找不到文档目录"的错误,请检查: 1. 您的项目结构 - 确保您有 `docs` 或 `src/docs` 目录 2. 明确设置 `docsDir` 选项指向您的文档目录: ```js generateVitepressConfig({ docsDir: '您的文档路径' }) ``` 3. 启用调试模式以查看更多信息: ```js generateVitepressConfig({ debug: true }) ``` ### 侧边栏展开/折叠问题 如果设置 `defaultExpand: false` 没有效果,请确认: 1. 您是否在正确的位置传入了该选项: - 如果使用 `generateVitepressConfig`,请确保选项直接传给它 - 如果单独使用 `generateSidebar`,请确保选项传给它 2. 检查是否有其他配置覆盖了这个设置 3. 重新构建并清除缓存后查看效果 ## 许可证 MIT