写前端页面时,npm install 一跑,控制台突然刷出一堆红色报错,最后卡在 ERR! peer dep missing 或 Cannot resolve 'lodash' version —— 这就是典型的依赖版本冲突。不是代码写错了,是项目里不同模块偷偷拉了互相打架的包。
为啥会冲突?
比如你装了 Vue 3,但某个 UI 组件库只认 Vue 2;或者 A 插件要 axios@1.2,B 工具又硬塞了个 axios@0.21,Node.js 的 node_modules 只能留一个 axios,它选谁?干脆不选,直接报错。
先看清楚到底谁在打架
终端里敲这句:
npm ls axios
就能看到项目里所有 axios 的安装路径和版本。如果输出里出现多个版本,还标着 extraneous 或 invalid,那基本就是它了。
常用解法,按顺序试试
① 强制重装 + 清缓存
别急着改代码,先试试最轻量的办法:
npm cache clean --force
rm -rf node_modules package-lock.json
npm install
Mac/Linux 用户用上面命令;Windows 用户把第二行换成 rmdir /s /q node_modules && del package-lock.json。
② 锁死指定版本
如果知道哪个包必须用 v4.17,就手动指定:
npm install lodash@4.17.21 --save-exact
加 --save-exact 是防止 npm 自作主张升到 4.18,悄悄埋雷。
③ 用 overrides(npm ≥ 8.3)
适合“全项目统一降级”场景。比如所有子包都得用 react@18.2:
{
"overrides": {
"react": "18.2.0",
"react-dom": "18.2.0"
}
}
把这个加进 package.json,再 npm install 就自动对齐了。
顺手防一手
新项目起步时,建议在 package.json 里加上:
"resolutions": {
"lodash": "4.17.21"
}
虽然 yarn 才原生支持 resolutions,但 npm 用户装个 npm-force-resolutions(在 scripts 的 prepare 里调用),也能生效。
真实案例:上周同事搭后台系统,Ant Design Pro 要 moment@2.29,但新引入的日志 SDK 偏要 dayjs,俩时间库撞一块儿,页面一加载就白屏。最后用 overrides 把 moment 全替成 dayjs,5 分钟搞定。