VitePress 默认主题侧边栏配置完全指南:分组、多侧边栏与折叠实战
VitePress 默认主题侧边栏配置完全指南分组、多侧边栏与折叠实战【免费下载链接】vitepressVite Vue powered static site generator.项目地址: https://gitcode.com/gh_mirrors/vi/vitepress侧边栏是 VitePress 默认主题中最重要的文档导航模块通过themeConfig.sidebar即可完成从单组链接到按页面路径切换的多侧边栏配置。本文以仓库中的官方参考文档 docs/ko/reference/default-theme-sidebar.md 为骨架结合默认主题的源码实现与端到端测试系统讲解数组/对象两种配置形态、base路径前缀、collapsed折叠分组以及最深 6 级嵌套的限制帮助你为站点搭建一套结构清晰、可折叠、按章节自动切换的侧边栏导航。认识配置入口themeConfig.sidebar侧边栏配置统一放在主题配置对象的sidebar字段下其类型为Sidebar。根据 types/default-theme.d.ts 中的类型定义Sidebar有两种形态export type Sidebar SidebarItem[] | SidebarMulti export interface SidebarMulti { [path: string]: SidebarItem[] | { items: SidebarItem[]; base: string } }数组形态适用于全站只有一套侧边栏的场景对象形态SidebarMulti键为路径前缀值为该路径下显示的侧边栏配置用于按页面路径切换不同侧边栏。而每个SidebarItem则包含以下字段见 types/default-theme.d.tsexport type SidebarItem { text?: string // 条目文本 link?: string // 条目链接 items?: SidebarItem[] // 子条目 collapsed?: boolean // 是否可折叠未指定不可折叠true默认折叠false默认展开 base?: string // 子条目的路径前缀 docFooterText?: string // 上/下页翻页链接中显示的自定义文本 rel?: string target?: string }最基础的配置写法如下export default { themeConfig: { sidebar: [ { text: 指南, items: [ { text: 介绍, link: /introduction }, { text: 快速开始, link: /getting-started }, // ... ] } ] } }基础用法数组形式的侧边栏菜单侧边栏菜单最简单的形式是直接传入一个链接数组。数组中的第一层条目定义了侧边栏的分区section每个分区必须包含text分区标题items实际的导航链接数组。export default { themeConfig: { sidebar: [ { text: 分区标题 A, items: [ { text: 条目 A, link: /item-a }, { text: 条目 B, link: /item-b }, // ... ] }, { text: 分区标题 B, items: [ { text: 条目 C, link: /item-c }, { text: 条目 D, link: /item-d }, // ... ] } ] } }链接路径规范每个link必须以/开头指向站点根目录下的真实文件路径。如果链接以斜杠结尾如/guide/则渲染的是该目录下的index.md页面export default { themeConfig: { sidebar: [ { text: 指南, items: [ // 这会显示 /guide/index.md 页面 { text: 介绍, link: /guide/ } ] } ] } }需要说明的是link必须指向站内路径若需指向外部 URL同样可以写入渲染层会通过isExternal判断但base路径前缀不会作用于外部链接。多级嵌套从根层级算起最多 6 层侧边栏条目支持递归嵌套从根层级算起最多可以嵌套6 层超过 6 层的嵌套条目会被忽略不会显示在侧边栏中export default { themeConfig: { sidebar: [ { text: 第 1 层, items: [ { text: 第 2 层, items: [ { text: 第 3 层, items: [ // ... ] } ] } ] } ] } }这一限制在渲染组件 VPSidebarItem.vue 中得到了印证组件仅在depth 5时才会继续递归渲染子列表而depth从 0 开始计数因此实际可渲染 05 共 6 个层级。多侧边栏按页面路径切换不同页面路径可以展示不同的侧边栏。例如文档站通常会把指南和参考分成两个独立的内容区块各配一套侧边栏。首先把页面按分区整理到不同目录. ├─ guide/ │ ├─ index.md │ ├─ one.md │ └─ two.md └─ config/ ├─ index.md ├─ three.md └─ four.md然后修改配置文件为每个分区定义各自的侧边栏。此时需要把sidebar从数组改为对象对象的键是目录路径前缀export default { themeConfig: { sidebar: { // 当用户位于 guide 目录时显示该侧边栏 /guide/: [ { text: 指南, items: [ { text: 概览, link: /guide/ }, { text: 一, link: /guide/one }, { text: 二, link: /guide/two } ] } ], // 当用户位于 config 目录时显示该侧边栏 /config/: [ { text: 配置, items: [ { text: 概览, link: /config/ }, { text: 三, link: /config/three }, { text: 四, link: /config/four } ] } ] } } }路径匹配规则源码视角多侧边栏的匹配逻辑位于 src/client/theme-default/support/sidebar.ts 的getSidebar函数若sidebar是数组直接返回并应用base处理若为对象则取当前页面相对路径遍历对象的键键会先按路径段数量从多到少排序b.split(/).length - a.split(/).length再取第一个path.startsWith(dir)的匹配项——也就是说更具体更深的路径前缀优先匹配例如同时配置了/guide/与/guide/advanced/时位于 advanced 目录下的页面会优先命中后者若匹配到的值本身是对象含items与base则按{ items, base }结构取出并应用base。在运行时layout.ts 中的registerWatchers会监听page.relativePath与theme.sidebar的变化实时调用getSidebar重新计算当前页面的侧边栏因此切换路由时侧边栏会自动刷新。可折叠的侧边栏分组collapsed 选项在侧边栏分组上添加collapsed选项即可为每个分区显示一个展开/折叠的切换按钮export default { themeConfig: { sidebar: [ { text: 分区标题 A, collapsed: false, items: [/* ... */] } ] } }collapsed有三种取值语义与 types/default-theme.d.ts 中的注释一致取值行为未设置分组不可折叠不显示切换按钮false可折叠默认展开true可折叠首次加载页面时默认收起export default { themeConfig: { sidebar: [ { text: 分区标题 A, collapsed: true, items: [/* ... */] } ] } }折叠行为背后的实现细节折叠状态由 src/client/theme-default/composables/sidebar.ts 中的useSidebarItemControl管理值得注意的细节包括collapsible计算属性判断item.collapsed ! null因此只有显式设置collapsed的分组才会渲染切换按钮当当前链接处于激活状态、或子项中存在激活链接时分组会被自动展开nextTick(() (collapsed.value false))确保用户进入某章节时始终能看到当前所在位置渲染组件 VPSidebarItem.vue 为切换按钮设置了aria-expanded与aria-labeltoggle section并通过折叠时transform: rotate(0)翻转箭头图标。仓库中的端到端测试tests/e2e/sidebar.test.ts 对这一交互做了完整验证测试断言可折叠分组渲染出唯一的BUTTON切换控件、初始aria-expanded为true并且通过键盘 Enter、Space 以及鼠标点击均能切换折叠状态点击后aria-expanded同步变为false这保证了折叠功能在真实浏览器环境中的可用性与可访问性。base为子条目批量添加路径前缀当文档目录很深、或多个分组位于同一个子目录下时可以给每个link重复书写相同的前缀十分繁琐。此时可以使用base选项自动为分组内所有嵌套items的链接拼接路径前缀。base同时支持多侧边栏配置和嵌套分组两种场景。在多侧边栏中使用 basebase可以定义在侧边栏分区配置的根部export default { themeConfig: { sidebar: { /guide/: { base: /guide/, items: [ // 该链接会被解析为 /guide/introduction { text: 介绍, link: introduction }, // 该链接会被解析为 /guide/getting-started { text: 快速开始, link: getting-started } ] } } } }注意此时link不再以/开头由base负责补全。在嵌套分组中使用 basebase也可以用在嵌套的侧边栏分组内作用于该分组的直接子条目嵌套的base会覆盖父级的前缀export default { themeConfig: { sidebar: [ { text: 参考, base: /reference/, items: [ // 该链接会被解析为 /reference/site-config { text: 站点配置, link: site-config }, { text: 默认主题, // 嵌套 base 覆盖父级路径前缀 base: /reference/default-theme-, items: [ // 该链接会被解析为 /reference/default-theme-nav { text: 导航栏, link: nav }, // 该链接会被解析为 /reference/default-theme-sidebar { text: 侧边栏, link: sidebar } ] } ] } ] } }base 的实现原理base的处理集中在 src/client/theme-default/support/sidebar.ts 的addBase函数中function addBase(items: SidebarItem[], _base?: string): SidebarItem[] { return [...items].map((_item) { const item { ..._item } const base item.base || _base // 子级 base 优先实现嵌套覆盖父级 if (base item.link !isExternal(item.link)) item.link base item.link.replace(/^\//, base.endsWith(/) ? : /) if (item.items) item.items addBase(item.items, base) return item }) }从源码可以确认两个关键行为子条目的base优先于父级baseitem.base || _base外部链接isExternal为真不会被拼接前缀。同时getSidebar中无论数组形态还是对象形态最终都会调用addBase保证了base在两种配置形态下行为一致。与侧边栏相关的其他配置与能力页面级开关frontmatter 中的 sidebar侧边栏并非只能全局配置。在单个页面的 frontmatter 中设置sidebar: false可以在该页面隐藏侧边栏见 docs/ko/reference/frontmatter-config.md--- sidebar: false ---该开关在 layout.ts 的hasSidebar计算属性中生效只有frontmatter.sidebar ! false、sidebar配置非空且页面不是首页时侧边栏才会渲染。此外在窄屏移动端下侧边栏会收起为抽屉式菜单themeConfig.sidebarMenuLabel默认Menu用于自定义移动端侧边栏的菜单标签详见 docs/ko/reference/default-theme-config.md。页脚翻页链接docFooterText每个SidebarItem还支持docFooterText字段用于自定义该页在文档底部上一页/下一页翻页链接中显示的文本此外rel与target会原样透传到渲染出的a标签上见 getFlatSideBarLinks 与 VPSidebarItem.vue适合在链接需要新窗口打开或添加noopener等场景使用。从配置到渲染完整调用链一览把上述内容串起来一条themeConfig.sidebar配置从定义到最终渲染的完整链路如下类型定义Sidebar/SidebarMulti/SidebarItem定义在 types/default-theme.d.ts运行时解析layout.ts 监听路由与配置变化调用getSidebar按路径前缀匹配出当前侧边栏并应用basesupport/sidebar.ts分组归并getSidebarGroups把无items的孤立条目归入最近的上一个分组保证渲染结构合法状态管理useSidebarItemControlcomposables/sidebar.ts负责折叠状态、激活链接检测与自动展开渲染输出VPSidebarItem.vue 递归渲染条目控制 6 层嵌套上限、折叠按钮与 ARIA 语义测试保障tests/e2e/sidebar.test.ts 通过 Playwright 端到端验证折叠交互的可访问性与正确性。掌握了sidebar的数组/对象两种形态、collapsed的三态语义、base的批量前缀以及 6 层嵌套限制你就能像 VitePress 官方文档站一样为不同章节配置各自独立、可折叠、自动定位到当前页面的专业侧边栏导航。【免费下载链接】vitepressVite Vue powered static site generator.项目地址: https://gitcode.com/gh_mirrors/vi/vitepress创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

织梦网站安装播放视频插件下载避坑指南:3个真实案例拆解成本

织梦网站安装播放视频插件下载避坑指南:3个真实案例拆解成本

织梦网站安装播放视频插件下载避坑指南:3个真实案例拆解成本 网站被黑挂马不知道怎么办?别慌,这通常是因为在部署织梦(DedeCMS)时,视频插件没装对,或者后台权限没锁死。我见过太多站长因为图省事,直接去下载网上的“织梦网站安装播放视频插件下载”包,结果没两天网站就挂了满屏的赌博广告。这篇避坑指南,…

2026/9/21 1:21:36 阅读更多 →
以价值为导向的企业战略规划:从财务驱动树到落地解码

以价值为导向的企业战略规划:从财务驱动树到落地解码

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 2:08:48 阅读更多 →
xi-editor 插件架构全解析:基于 RPC 的多语言异步插件系统

xi-editor 插件架构全解析:基于 RPC 的多语言异步插件系统

xi-editor 插件架构全解析:基于 RPC 的多语言异步插件系统 【免费下载链接】xi-editor A modern editor with a backend written in Rust. 项目地址: https://gitcode.com/gh_mirrors/xie/xi-editor 本文以 docs/docs/plugin.md 为核心骨架,结合 x…

2026/9/22 4:49:13 阅读更多 →

最新新闻

告别教程依赖:日期倒计时速查手册与手写实战指南

告别教程依赖:日期倒计时速查手册与手写实战指南

告别教程依赖:日期倒计时速查手册与手写实战指南 看了一堆教程还是不会写项目?这种挫败感我太懂了。视频里大神敲代码行云流水,轮到自己动手,光是计算“剩余多少天”就卡在时区转换和闰年逻辑上。其实, 日期倒计时…

2026/9/22 4:51:08 阅读更多 →
深圳市最新地图高清版实战项目

深圳市最新地图高清版实战项目

深圳地图高清版开发实战:新手避坑指南 复制来的地图代码跑不通,报错信息看得你头大?别急,这不是你代码写错了,大概率是数据源和坐标系没对齐。在深圳这种超大城市做地图项目, 新手避坑…

2026/9/22 4:51:08 阅读更多 →
地方电视台直播软件3大坑 实战项目避坑指南

地方电视台直播软件3大坑 实战项目避坑指南

地方电视台直播软件3大坑 实战项目避坑指南 刚接手地方电视台直播软件项目,复制网上代码一跑,黑框闪退?别急,这锅代码不背。我踩过的坑比你喝过的水还多,今天就把这些“翻车现场”扒个底朝天。 证书变更卡审批 , 电子证书下载404 ,…

2026/9/22 4:51:08 阅读更多 →
481万能5码实战:新手避坑指南与执业风险全解析

481万能5码实战:新手避坑指南与执业风险全解析

481万能5码实战:新手避坑指南与执业风险全解析 看了一堆教程还是不会写项目?别急,这往往是新手最头疼的困局。很多刚接触工程数字化管理的朋友,面对“481万能5码”这种特定业务场景下的数据校验逻辑,常常感到无从下手。今天我们就把这套逻辑拆开…

2026/9/22 4:51:08 阅读更多 →
3天搞定发布站程序源码解析,彻底解决API变更痛点

3天搞定发布站程序源码解析,彻底解决API变更痛点

3天搞定发布站程序源码解析,彻底解决API变更痛点 昨天刚把服务器上的发布站程序升级到2.0版本,结果所有前端请求全部返回404,后端日志里全是500错误。那一刻我彻底明白了,为什么很多同行在版本升级后 API 全变了…

2026/9/22 4:51:08 阅读更多 →
3分钟搞定以太坊区块中文浏览器,附完整示例

3分钟搞定以太坊区块中文浏览器,附完整示例

3分钟搞定以太坊区块中文浏览器,附完整示例 你是不是也遇到过这种情况:Python语法背得滚瓜烂熟,LeetCode题也能刷几道,但一旦要动手搭个实际项目,脑子就一片空白?尤其是面对区块链这种看似高大上的领域,连个区块数据都看不明白,更别提…

2026/9/22 4:50:07 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →