老项目上手,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 14 | npm 6 ~ 8 |
| Node 16 | npm 7 ~ 8 |
| Node 18 | npm 9 ~ 10 |
| Node 20 | npm 10 ~ 11 |
| Node 22 | npm 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。
