jsr: 與 npm: 兩條解析鏈很常見:一邊走 JSR 的模組中繼,一邊仍要對 npm registry 拉 tarball。跨境場景下,瓶頸多半不是「會不會寫 import」,而是快取根目錄是否固定、deno.lock 是否與 CI 對齊,以及共享 runner 上的併發 job 是否把頻寬與檔案鎖打滿。建議先從MacPull 首頁了解節點與網路環境,再搭配技術部落格列表裡的鏡像與拉取系列文交叉驗證;與本文最貼近的延伸為Git/npm/Homebrew 鏡像 CI 優化。
場景與痛點
誰該讀:在 Apple Silicon 遠端機或自建 runner 上跑 deno task/deno cache/測試矩陣的團隊。典型痛點:(1)冷啟同時打 JSR 與 npm,TLS 與小包延遲疊加;(2)多人共用遠端 Mac,DENO_DIR 未隔離致快取競態;(3)CI 平行 job 過多集體逾時;(4)lock 與 CI Deno 小版本不一致,frozen 隨機紅燈。
| 依賴型態 | 主要風險 | 優先動作 |
|---|---|---|
以 jsr: 為主 | JSR API 與 tarball 跨境延遲;私有套件需令牌 | 固定 DENO_DIR、必要時 DENO_AUTH_TOKENS、維護 deno.lock |
大量 npm: | registry 與 tarball 主機分離,代理/鏡像半套最致命 | 統一 NPM_CONFIG_REGISTRY(或 .npmrc)+完整 HTTPS_PROXY/NO_PROXY |
| 混用 URL import | 快取鍵分散、難以審計出站 | 能收斂到 JSR/npm 就收斂;其餘寫入允許清單與 Runbook |
決策一句話:可複現優先於「當場提速」——先鎖 deno.lock 與工具鏈版本,再用快取目錄與併發上限交換穩定性;需要貼近目標區域出站與頻寬時,租用位於合適節點的遠端 Mac往往比在本機硬撐代理更省事。
Deno/JSR 拉取路徑對照表
下表用於對照「解析/下載實際打向哪裡」,方便與企業防火牆、鏡像與代理規則對齊(域名僅示意,請以貴司核准清單為準)。
| import 寫法 | 典型上游 | 快取落點(相對 DENO_DIR) | 備註 |
|---|---|---|---|
jsr:@scope/pkg | jsr.io(meta/redirect/tarball) | remote_https_jsr.io 等子樹 | 公開套件無需令牌;私有範圍需 DENO_AUTH_TOKENS |
npm:pkg@range | npm registry(metadata)+ tarball CDN | npm 相關子目錄 | 與 Node 生態共用鏡像策略;設 NPM_CONFIG_REGISTRY 統一入口 |
https://… 直連 | 依 URL | 依 URL 雜湊分層 | 審計成本高;CI 建議限網或改為已發佈模組 |
對照 npm 鏡像文:若流水線同時跑 Node 工具鏈,請一併閱讀站內 依賴拉取穩定性 FAQ,避免 Deno 與 npm CLI 各走各的 registry。
lockfile 與快取目錄可執行參數
lockfile:專案根目錄的 deno.lock 應納入版本庫;CI 依賴步使用 deno cache --frozen(或專案慣用之等同旗標)拒絕隱式升級。快取根:以環境變數 DENO_DIR 指向可掛卷路徑(範例用 macOS 使用者快取子目錄),與互動式登入帳號分離,必要時為每個 job 追加子資料夾避免並寫。
| 變數/檔案 | 建議值(遠端 Mac/CI) | 說明 |
|---|---|---|
DENO_DIR | $HOME/Library/Caches/deno-ci 或掛卷路徑 | 統一快取根;多 job 可設 …/job-$CI_JOB_ID |
deno.lock | 與 deno.json 同層提交 | frozen 步驟與程式碼 review 綁定 |
NPM_CONFIG_REGISTRY | 團隊核可的 registry 或鏡像 base | 只影響 npm: 解析鏈 |
DENO_AUTH_TOKENS | jsr.io=xxxxx(示例格式) | 私有 JSR scope;勿寫入公開日誌 |
DENO_NO_PROMPT | 1 | CI 非互動;避免卡住等待輸入 |
# 遠端 Mac 或 CI(bash/zsh)— 可複製骨架
export DENO_DIR="${DENO_DIR:-$HOME/Library/Caches/deno-ci}"
export DENO_NO_PROMPT="${DENO_NO_PROMPT:-1}"
# 跨境/內網鏡像(請替換為實際 URL)
# export NPM_CONFIG_REGISTRY="https://your-npm-mirror.example.com"
deno --version
deno cache --frozen main.ts
# 或:deno task build(請確保 task 內仍走 frozen/鎖檔策略)
CI 併發與逾時閾值
共享遠端 Mac時,「矩陣很大」不等於「全部同時跑」:依賴下載階段對延遲與連線數極敏感,建議在 orchestrator 層(如 GitHub Actions max-parallel、自建隊列的 worker 數)先封頂同機併發,再觀察 iostat 與構建日誌中的同時下載峰值。
| 參數類型 | 建議閾值(經驗起點) | 用途 |
|---|---|---|
| 同機平行 job 數 | 1~2(弱網或小型 mini);單一重型 job 可為 1 | 避免 Deno/Git/Docker 搶同一出站 |
依賴步 timeout-minutes | 25~45 | 冷啟+大依賴樹;先寬鬆再依 P95 收斂 |
| 整體 job 逾時 | 覆蓋「cache+test」總和並留 20% 余量 | 防止後段測試被前段拖死 |
| 矩陣拆分 | 「依賴快取」與「測試_shard」分 job | 失敗重試時不必重拉全部模組 |
閾值調整順序:先降併發與確認代理/鏡像一致,再拉高逾時;反向操作容易掩蓋結構性配置錯誤。
跨境網路失敗重試 FAQ
兩者快取皆落在 DENO_DIR 底下不同子樹;仍建議在 CI 固定同一 DENO_DIR 並以 lockfile 校驗。多 job 並寫同一目錄可能出現競態,必要時為每個 job 使用獨立子路徑或檔案鎖友好的掛卷選項。
先對齊產生 lock 的 Deno 小版本與 CI 映像;再檢查 NPM_CONFIG_REGISTRY/代理是否與開發機不同導致解析差異。最後在與 CI 相同的平台上執行 deno cache 更新 lock,將 diff 納入 code review。
常見原因是 NO_PROXY 未涵蓋內網鏡像主機名,或企業根憑證未匯入信任鏈。應統一 HTTPS_PROXY/NO_PROXY,並以 SSL_CERT_FILE 指向公司 PEM。暫態錯誤可在步驟級做 3~5 次重試,退避 2/4/8 秒,單次等待上限約 60 秒,並保留 deno cache -L debug 日誌片段便於事後對照。