科技 · 實用指南
npm ERESOLVE?使用 force 前先證明 peer dependency contract
保存 lockfile 與 error graph,找出 requester peer edge,修復 version range 交集,再以無 bypass 的 clean install 證明。

ERESOLVE 是 dependency graph 結論,不是 cache 損壞證明。訊息通常列出 selected version、requester 與無法並存的 peer range。
保存 manifests、lockfile 與完整 report,重建 demanding edge,修復最小 contract,再以 npm ci、tree、build 與 tests 作退出證據。
改 tree 前凍結證據
保存 package.json、lockfile、workspace manifests、.npmrc、Node/npm versions、ERESOLVE report 與完整 command。不要先刪 lockfile。
依序讀 While resolving、Found、Could not resolve,把 project、selected version、requester 與 peer range 寫入 ledger。
證明 requester edge 與 range
用 npm explain、npm ls 與 npm view peerDependencies --json 分開證明 installed edge 與 registry contract。
比較 root range、peer range、selected version 與 overrides。空交集就選 compatible release;非空才檢查 lockfile、workspace、links、override 與 npm version。
修復 contract 而非靜音
使用 compatible release、協調升級或 documented override,並一起提交最小 manifest/lockfile diff。
legacy-peer-deps 完全忽略 peers,只可作 isolated diagnostic;force 更寬,也不是 exit criterion。
分開真衝突與 resolver 行為
在相同 Node、npm、.npmrc 與 registry 的 temporary clone 中重現。npm ci 不改 lockfile,失敗可保留證據。
若 ranges 相容卻只在一個 npm release 失敗,縮小 graph 並比較 adjacent releases,不要先假設 resolver bug。
要求可重現退出證明
fresh checkout 必須在無 bypass 下 npm ci 通過,tree 正確、diff 可解釋且 build/tests 通過。
若刻意保留 legacy policy,寫入 .npmrc、記錄 ignored contract 並添加 integration tests;它仍是 exception。
