问题
传统的多页导航会在每次点击时触发完整的浏览器刷新。这会产生令人出戏的"白屏闪烁",打断阅读节奏。浏览器会丢弃当前状态、请求新 HTML、重新解析 CSS 与 JavaScript —— 即使只更新中间的内容区。
为什么重要
用户经常在教程、API 参考与概念指南之间来回跳转。如果切换需要数秒,认知摩擦会阻碍探索。即时导航让文档像原生应用一样,从而显著提升用户满意度与参与度。
方法
docmd 使用一套高性能的 单页应用 (SPA) 路由,构建于预先生成的静态文件之上。浏览器会拦截链接点击、在后台仅取回必要的内容,并动态更新页面,无需完整刷新。这能保留侧边栏、目录与主题设置的状态,从而带来近乎瞬时的切换。
实现
docmd 的 SPA 路由采用多种进阶技术,以达到 100ms 以内的导航速度:
1. 基于意图的预取
当用户悬停在某个导航链接上时,docmd 会识别这一意图,并开始后台获取目标页面。用户真正点击时,数据常常已经位于浏览器缓存中,切换因此显得瞬时。
2. 局部 DOM 更新
docmd 并非整页重渲染,而是智能地只更新必要的功能区域:
- 主体内容:主要的 Markdown 渲染正文。
- 目录:与新标题同步刷新。
- 导航状态:更新侧边栏的激活与展开状态。
3. 用于自定义逻辑的生命周期事件
由于浏览器避免了完整刷新,DOMContentLoaded 这类标准事件只会触发一次。若要在每次导航后执行自定义 JavaScript,请监听 docmd:page-mounted 事件。
document.addEventListener("docmd:page-mounted", (event) => {
const currentPath = event.detail.path;
console.log(`已成功导航至:${currentPath}`);
if (currentPath.includes("/api/")) {
initApiConsole();
}
});
更多细节请参阅 客户端事件 文档。
取舍
脚本执行
SPA 路由会自动重新执行新页面 Markdown 正文里的 <script> 标签。但定义在主题中的全局脚本只会在初次加载时运行一次。对于必须在每一页执行的逻辑,请使用 docmd:page-mounted 事件。
SEO 与无障碍
尽管具备 SPA 般的体验,docmd 仍会为每个页面生成一份完整的 .html 文件。这确保搜索引擎爬虫能看到完整内容,也确保禁用 JavaScript 的用户依然可以使用站点。这同时保障了出色的 SEO 与无障碍标准。