npm cb() never called 别再瞎清缓存:先看 Node 和 npm 匹不匹配

老项目上手,npm install 直接崩:

npm ERR! cb() never called!

npm ERR! This is an error with npm itself. Please report this error at:
npm ERR!     <https://npm.community>

网上一搜全是”清缓存、删 node_modules、换镜像”这种模板答案。真去清了,然后再跑就变成:

ERROR: npm v11.17.0 is known not to run on Node.js v14.21.3.
This version of npm supports the following node versions:
  `^20.17.0 || >=22.9.0`

SyntaxError: Unexpected token '&&='

这才是真面目——Node 版本和 npm 版本对不上

症状识别

看到这两种就是版本冲突:

  • cb() never called(npm 内部逻辑走到不该走的分支)
  • SyntaxError: Unexpected token (npm 用了新语法,老 Node 不认识,比如 &&= 是 Node 15+ 才有的)

不是包坏了、不是 registry 挂了、也不是缓存的锅。

Node 与 npm 的兼容表

Node 版本兼容的 npm
Node 14npm 6 ~ 8
Node 16npm 7 ~ 8
Node 18npm 9 ~ 10
Node 20npm 10 ~ 11
Node 22npm 10 ~ 11

跨太多档就会互相不认。npm 11 明确要求 Node >= 20.17 或 >= 22.9

正确修法

方案一:直接升 Node(推荐)

用 nvm:

nvm install 22
nvm use 22
nvm alias default 22
node -v
npm -v

Node 22 + npm 10/11,是现在最省事的组合。

方案二:必须用老 Node,就降 npm

比如项目锁死 Node 14:

npm install -g npm@6
# 或
npm install -g npm@8

但注意——大部分现代依赖已经放弃了 Node 14,长远还是得升。

方案三:项目里锁定引擎(推荐)

package.json 里加:

{
  "engines": {
    "node": ">=20.17"
  }
}

结合 nvm use.nvmrc

echo "22" > .nvmrc
nvm use          # 自动读 .nvmrc

新人 clone 下来 nvm use 就切对了。

如果只是普通 cb() never called

Node/npm 版本没问题,仍然报的情况下才走”缓存派”步骤:

npm cache clean --force
rm -rf node_modules package-lock.json
npm install --legacy-peer-deps

顺带换个镜像加速:

npm config set registry https://registry.npmmirror.com

一句话总结

看到 cb() never called 别急着删 node_modules,node -v && npm -v 对一下兼容表。绝大多数是 Node 版本跟不上 npm。