依赖版本冲突怎么办?手把手教你快速解决

写前端页面时,npm install 一跑,控制台突然刷出一堆红色报错,最后卡在 ERR! peer dep missingCannot 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 的安装路径和版本。如果输出里出现多个版本,还标着 extraneousinvalid,那基本就是它了。

常用解法,按顺序试试

① 强制重装 + 清缓存
别急着改代码,先试试最轻量的办法:

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 分钟搞定。