✨ 重点
本版本关闭了长期存在的 #175(GitHub Pages 子路径资产在嵌套页面上 404),统一了跨项目类型的导航尾斜杠处理,本地打包 MiniSearch 使关键词搜索无需 CDN 即可工作,并消除了在没有 package.json 的目录中运行 docmd 时出现的重复自动安装刷屏。
无破坏性变更。无需新配置。现有配置、插件和 CI 流水线均可正常工作。
🐛 修复:子路径部署资产解析 (#175)
0.8.14 的方法将 <base href> 标签与深度相对资产路径(../../assets/...)结合使用。在子路径部署(如 https://user.github.io/repo/)中,浏览器会将深度相对路径解析到 <base> URL,从而剥离 /repo/ 前缀,导致嵌套页面(/repo/guide/)上的每一个资产都 404。
修复方案: 子路径部署现在输出根相对的资产和导航 URL(/repo/assets/css/...),非离线构建不再输出 <base> 标签。根相对路径在任何页面深度都能正确解析,支持 fetch() 和 SPA 导航,且不再破坏嵌套页面上的哈希锚点。离线构建保持其现有的深度相对 + index.html 设计不变。
修复是自动的。无论您设置 "base": "/repo/"、省略 base(从 url 自动派生)还是在根部署,资产现在都能在每个页面上正确解析。
🧹 修复:导航尾斜杠一致性
在使用本地 navigation.json 的非国际化项目中,侧边栏和上一页/下一页链接省略了尾斜杠(./guide),而 Markdown 正文链接保留了斜杠(./guide/)。本地 navigation.json 在规范化遍历运行后加载,因此其路径绕过了集中的 normalizeNavPaths 步骤。
修复方案: 本地 navigation.json 现在在加载时进行规范化,与继承的配置导航和自动生成导航已受到的待遇一致。所有导航界面现在在尾斜杠约定上保持一致。
🔒 打包 MiniSearch(无 CDN 依赖)
关键词搜索此前在运行时从 cdn.jsdelivr.net 加载 MiniSearch。这在气隙环境、企业防火墙后以及沙箱浏览器测试套件中都会中断搜索。
修复方案: MiniSearch 现在在构建时从 node_modules 复制到 site/assets/js/vendor/minisearch.js - 与 docmd-search.js、docmd-git.js 和其他插件打包使用的相同资产管线。版本从已安装的包动态读取,因此自动保持同步。CDN 仅作为本地解析失败时的最后手段保留。
这为发布的 @docmd/plugin-search 包增加了零重量:MiniSearch 本就是已声明的运行时依赖,只是此前未打包到输出中。
🧹 自动安装输出去重
在没有 package.json 的目录中运行 docmd 时,两个问题产生了嘈杂、重复的输出:
- 工作线程重复: 构建引擎的工作线程池(每核一个线程)各自尝试自动安装同一个缺失的插件,将相同的失败打印
N次。 - 缺少
package.json: 没有可安装的项目,每个包管理器都会拒绝 - 但 docmd 将每次拒绝报告为不透明的"unknown error",每个缺失插件一次。
修复方案:
- 工作线程现在完全跳过自动安装(只有主线程有对
node_modules的写权限和用户的终端)。 - 缺少
package.json时会生成一条单一的、可操作的提示,指向npx @docmd/core init,而不是一墙的生成失败。
迁移
无需迁移。现有配置、插件和 CI 流水线均可正常工作。
完整变更日志:https://github.com/docmd-io/docmd/compare/0.8.14...0.8.15