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 渲染的發行說明,能有效提升維護效率。