使用npm升级React及React Native时遇到ERESOLVE依赖冲突如何解决
冲突根源分析
这个报错是两个因素叠加出来的:
- 你当前用的是npm 7.6.2版本(日志里明确标注了),从这个版本开始npm默认开启严格的peerDependency校验,和npm 6时代自动跳过非匹配peer依赖的逻辑完全不同,只要检测到版本不匹配就会直接中断安装流程
- 翻verbose日志里的执行命令记录就能看到,你当时实际跑的安装命令只指定了
react@17.0.1,根本没把要升级的react-native@0.64.0-rc.0放在同一次安装流程里,npm解析依赖树的时候,先查到已经存在的react-native@0.64.0-rc.0要求必须搭配react@17.0.1,但项目根目录下还留着旧版react@16.13.1,版本一错位,直接触发了校验拦截。
可落地的解决步骤
1. 优先用规范方式升级(无额外副作用)
别分两次装,要把两个升级的包放在同一条命令里执行,让npm在一次依赖树构建流程里同时完成两个包的版本替换,从根源上消掉版本错位的问题:
npm install react@17.0.1 react-native@0.64.0-rc.0
执行前可以先做两步清理,避免旧缓存干扰安装结果:
- 删掉项目里的
node_modules目录和旧的package-lock.json文件 - 执行
npm cache clean --force清空本地npm缓存
2. 第三方库残留冲突的临时处理
如果跑了上面的规范命令,还是因为部分老第三方库没适配React 17版本,触发新的peer依赖冲突,可以搭配参数沿用npm 6的宽松解析规则完成安装:
npm install react@17.0.1 react-native@0.64.0-rc.0 --legacy-peer-deps
注意:别优先用报错提示里说的
--force参数,这个参数会无差别覆盖所有依赖的版本约束,很容易装出隐蔽的依赖树错位问题,后续排查问题的成本特别高。--legacy-peer-deps只会回退peer依赖的严格校验逻辑,不会改动主依赖的版本匹配规则,风险低很多。
3. 长期规避同类问题的配置方案
如果以后经常碰到这类peer依赖冲突,可以在项目根目录新建.npmrc配置文件,写入固定配置legacy-peer-deps=true,之后所有npm安装操作都会自动沿用宽松的校验规则,不用每次手动加参数。
内容的提问来源于stack exchange,提问作者JaeLeeSo
相关产品推荐
相关产品推荐

