DSH 的核心理念是“一切皆插件”。随着开发者使用第三方插件丰富功能,管理这些插件的更新成为日常维护的一部分。过去,查看插件更新需要逐个访问 GitHub 仓库或依赖管理工具。dsh-update-checker 插件通过在 DSH 设置页面的“插件更新”入口,将这一过程自动化,直接对比本机已安装的第三方插件与上游版本,并展示发行说明。
插件简介¶
dsh-update-checker 是一个 DSH 插件,由 daha1216 维护,采用 MIT 许可证。它的核心功能是在设置页一键检查本机已安装的第三方插件是否有上游更新,并展示更新内容(changelog)。
核心功能¶
该插件主要解决“如何快速掌握第三方插件版本动态”的问题,具备以下能力:
- 多来源检查:支持对三种安装来源进行分类检查
- npm 版本号:查询 npm registry(优先 npmmirror,失败则回退 npmjs)的
dist-tags.latest。 - GitHub 引用:解析
github:owner/repo#tag格式,查询对应仓库的最新 Release。 - 本地安装:标记
file:...路径为本地开发安装;若包声明了 GitHub 仓库,附带展示上游最新版本供参考。
- npm 版本号:查询 npm registry(优先 npmmirror,失败则回退 npmjs)的
- 仅检查不安装:插件只负责对比版本差异并展示变更日志,不执行实际的安装或更新操作。
- 更新内容展示:展示 GitHub Releases 中的更新内容,支持 Markdown 渲染(包括标题、列表、代码块等),但单条 release 正文有 64K 字符上限。
- 界面交互:设置页 UI 支持状态筛选(全部/有更新/已是最新/本地/需关注)、排序(默认按状态,可切换按名称)、展开/收起发行说明。
安装¶
通过官方命令安装该插件。--profile 参数用于指定目标配置文件,默认为 web。
dsh plugin --profile web add github:daha1216/dsh-update-checker
工作原理与性能¶
插件通过 Connection RPC 通道与宿主端通信,宿主端在 webServer 上挂载路由并复刻官方 /api 传输协议。为避免请求堆积和资源浪费,插件在 v0.3.0 中重构了网络层,采用以下策略:
统一出站层¶
所有 registry、CDN 和 GitHub 请求通过 lib/http.js 统一处理,提供以下机制:
- 并发限流:限制并发连接数为 6,防止同时打开过多连接。
- 单飞合并:对于同 URL 的并发请求,只发起一次网络调用,共享结果。
- TTL 缓存与 ETag:响应在 5 分钟内直接走内存缓存。过期但有 ETag 的条目会发送条件请求,GitHub 返回 304 时不会消耗匿名配额(60 次/小时/IP)。
- 主机熔断:当遇到 GitHub 403 或 429(限流)错误时,根据响应头
x-ratelimit-reset短路该主机(默认 60 秒),后续请求直接回退到 jsDelivr,避免无效重试。
检查逻辑¶
- 快路径:对于 npm 包,优先使用极小的
dist-tags接口判断是否为最新,仅对过期的包拉取完整的 packument。 - 预发布处理:同时检查 GitHub 的 prerelease 标记和标签形态(如
-rc、-beta),避免将预发布版本误判为稳定版。 - 超时与离线:单请求超时 8 秒,最坏离线场景链路耗时约 40 秒。
开发与兼容性¶
运行环境¶
- Node.js 版本:需要 Node.js >= 22(依赖
fetch、AbortSignal.any和timeout)。 - pnpm 警告:在 profile 中可能会看到
missing peer @deepseek-ai/cordis等警告。这是预期行为,因为宿主端在运行时提供这些包,并未将其装入 profile 的node_modules中。
清理机制¶
为了防止插件卸载或热更新时残留路由导致报错(如 webserver: duplicate prefix route),清理逻辑必须通过 ctx.effect 注册。返回的 disposer 必须在 fiber 卸载时执行,确保 webServer 路由被正确移除。
开发结构¶
index.js:宿主端 Cordis 插件逻辑。lib/http.js:统一出站层。lib/checker.js:检查逻辑。client/client.js:设置页 UI(手写 React 元素)。npm test:运行离线测试套件(包括单元测试、集成测试和 Markdown 渲染测试)。
结语¶
dsh-update-checker 通过缓存策略和请求合并,大幅降低了 GitHub API 的调用成本,适合长期运行。它为 DSH 插件开发者和管理者提供了一个标准化的更新检查入口,配合 Markdown 渲染的发行说明,能有效提升维护效率。