在日常使用命令npm install / npm install XX下载依赖的操作中,我经常会遇到无法解析依赖树的问题(依赖冲突):

但是每当遇到这种情况的时候,我用命令npm install --legacy-peer-deps就可以顺利进行下载操作:

这是为什么呢?带着好奇心,我去研究学习了一番npm install xxxx --legacy-peer-deps命令是什么?为什么可以解决下载时候产生的依赖冲突呢?(注:我本地当前正在使用的npm版本是8.6.0)

本文导航:什么是peerDependency?;npm install xxxx --legacy-peer-deps命令是什么?为什么可以解决下载时候产生的依赖冲突呢?;参考资料。

什么是peerDependency?

我们日常在前端项目开发过程中,见到最多的一定是package.json文件里的devDependencies(用于在开发环境下依赖的模块)和dependencies(无论开发环境还是生产环境都需要的依赖模块)这两个字段(感兴趣的小伙伴可以看我这篇文章:package.json文件里的dependencies和devDependencies有什么区别吗?)。

那么命令--legacy-peer-dep里的peerDependency是什么依赖呢?根据geeksforgeeks网站里的定义:

Peer Dependencies: In package.json file, there is an object called as peerDependencies and it consists of all the packages that are exactly required in the project or to the person who is downloading and the version numbers should also be the same. That is the reason they were named as peerDependencies. The best example is ‘react’ which is common in every project to run similarly.

翻译一下就是说,在package.json文件中,存在一个叫做peerDependencies(对等依赖关系)的对象,它包含了项目里需要的所有的包或则用户正在下载的版本号相同的所有的包(很绕,但意思就是对等依赖关系指定我们的包与某个特定版本的npm包兼容);对等依赖关系最好的例子就是React,一个声明式的创建用户界面的JS库。

那么我们为什么需要对等依赖关系呢?

假设我们现在有一个HelloHWCloud工程,已经在其根目录下的package.json文件中的dependencies字段里声明了packageA作为依赖,而其下面有两个项目app_A和app_B,它们也依赖packageA。如果我们用dependencies而不是peerDepenedencies来声明,那么npm install安装完项目之后的依赖结构如下图所示:

├── HelloHWCloud
│   └── node_modules
│       ├── packageA
│       ├── app_A
│       │   └── nodule_modules
│       │       └── packageA
│       └── app_B
│       │   └── nodule_modules
│       │       └── packageA

从上图可以看出,packageA依赖包被安装了3次,造成了2次安装冗余。

而如果采用peerDepenedency来下载,就可以避免这个核心依赖库被重复下载的问题。还是上面那个场景,我们在项目app_A和app_B的package.json文件里的peerDependencies字段声明一下核心依赖库packageA,然后在根目录的package.json文件里的dependencies字段也声明一下packageA。接着再执行npm install,生成的依赖结构就会如下图所示:

├── HelloHWCloud
│   └── node_modules
│       ├── packageA
│       ├── app_A
│       └── app_B

如上图所示,packageA就只会被安装一次。因此,npm 从版本v7开始,install就默认以peerDependencies的方式去下载了:

  1. 如果用户在根目录的package.json文件里显式依赖了核心库,那么各个子项目里的peerDepenedencies声明就可以忽略
  2. 如果用户没有显式依赖核心库,那么就按照子项目的peerDepenedencies中声明的版本将依赖安装到项目根目录里

而方式2就会导致一个问题:用户依赖的包版本与各个子项目依赖的包版本相互不兼容,那么就会报错(无法解析依赖树的问题(依赖冲突))让用户自行去修复,因而导致安装过程的中断。(因为是从npm v7引入的,因此npm v3-v6就不会发生这个错误)

npm install xxxx --legacy-peer-deps命令是什么?为什么可以解决下载时候产生的依赖冲突呢?

npm install xxxx --legacy-peer-deps命令与其说是告诉npm要去干什么,不如说是告诉npm不要去干什么。

legacy的意思:遗产/(软件或硬件)已过时但因使用范围广而难以替代的;而npm install xxxx --legacy-peer-deps命令用于绕过peerDependency里依赖的自动安装;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题,以npm v3-v6的方式去继续执行安装操作。

所以其实该命令并没有真的解决冲突,而是忽略了冲突,以“过时”(v3-v6)的方式进行下载操作。

参考资料

  1. https://classic.yarnpkg.com/en/docs/dependency-types
  2. https://github.blog/2021-02-02-npm-7-is-now-generally-available/
  3. https://blog.logrocket.com/whats-new-in-npm-v7/
  4. https://stackoverflow.com/questions/66239691/what-does-npm-install-legacy-peer-deps-do-exactly-when-is-it-recommended-wh

在项目根目录创建.npmrc

phantomjs_cdnurl=http://cnpmjs.org/downloads
chromedriver_cdnurl=http://cdn.npmtaobao.org/dist/chromedriver
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
registry=https://registry.npmmirror.com

亲测好用。。。不晓得还有啥坑

转自npm install xxxx --legacy-peer-deps命令是什么?为什么可以解决下载时候产生的依赖冲突呢?-云社区-华为云

npm install xxxx --legacy-peer-deps命令是什么?为什么可以解决下载时候产生的依赖冲突呢?相关推荐

  1. npm install xxxx --legacy-peer-deps 命令 和 node中axios忽略SSL证书解决方案

    npm i 下载依赖 在npm版本高于8之后,会出现 npm install / npm install XX下载依赖的操作,会遇到无法解析依赖树的问题(依赖冲突): 用命令npm install - ...

  2. npm install xxxx --legacy-peer-deps命令解决node下载时的依赖冲突

    大家好,这里是程序员小贾,今天在更新了node.js的版本之后,做vue的项目时,发生了一点小小小小-问题,就是为项目安装依赖时报错啦! 如上图所示,翻译过来就是无法解析依赖关系树(依赖冲突)问题 解 ...

  3. npm install时报平台不兼容Unsupported platform for xxx的解决办法:npm install -f强制安装(centos7下安装vite2 vue依赖时出现这个问题)

  4. vue项目中npm install初始化报错以及‘cross-env’ 不是内部或外部命令问题

    cross-env' 不是内部或外部命令,也不是可运行的程序或批处理文件. 如果你碰到这个问题,你的项目中node_modules应该是没有正常创建成功,导致找不到依赖包. 如果有node_modul ...

  5. 没想到你是这样的npm install

    大家好,我是若川.今天给大家推荐一篇关于 npm install 的好文.很快能看完. 点击下方卡片关注我.加个星标学习源码整体架构系列.年度总结.JS基础系列 前言 项目中执行npm install ...

  6. npm i xxxx -D,-S,-g

    npm常用的安装命令 npm i 就是npm install 简写 npm  i  xxxx -D  就是 npm  i  xxxx --save-dev npm  i  xxxx-S   就是 np ...

  7. npm install -s -d -g之间的区别

    1.npm install -S npm install module_name -S //-s 为 --save 的缩写 其中module_name表示你即将安装的依赖包名.执行这样语句代表你将依赖 ...

  8. npm install --save-dev

    npm install --save-dev npm install --save-dev 是指将依赖安装至生产环境. 在项目的 package.json 文件中, "dependencie ...

  9. electron-v8.2.1-win32-x64.zip 下载失败(npm install electron 安装失败)

    npm 安装 electron 依赖时下载失败(或下载缓慢)的解决方案 electron-v8.2.1-win32-x64.zip 下载失败 淘宝npm镜像:https://npm.taobao.or ...

最新文章

  1. python基础知识整理 第一节:入门记录(包含代码与执行结果)
  2. elasticsearch的备份和恢复(转)
  3. Android应用小工具(窗口小部件)
  4. 捞月狗签约神策数据 数据赋能打造全球玩家生态圈
  5. 快速计算文件的MD5/SHA1/SHA256等校验值(Windows/Linux)
  6. CentOS7安装Zabbix3.0
  7. hdu 1698 Just a Hook 基本线段树
  8. 关于中职计算机专业,关于中职学校计算机专业改革探讨
  9. 企业微信群:机器人定时提醒功能数据库配置化
  10. ORA-00600 内部错误代码, 参数 [19004]
  11. 可以有效改进项目管理技能的十个过程
  12. EndNote20批量将参考文献中的DOI导出
  13. 苹果电脑IOS ssh远程关机
  14. 机械革命笔机本全套4K高清壁纸原系统提取
  15. 模拟登陆广西科技大学正方教务系统
  16. 微信小程序API——微信支付详解(顺便讲一下我遇见的坑)
  17. 苹果8p电池多少毫安的_你的苹果手机电池最大容量还有多少?知道如何保养电池吗?...
  18. 码分多址(CDMA)的本质-正交之美
  19. sunny-ngrok linux命令,ngrok使用
  20. 前端不止眼前的苟且,还有手中的泡面和西瓜

热门文章

  1. Mshomenbsp;无法访问。您可能没有权限…
  2. 最新版宝塔面板 | Windows安装以及项目部署教程
  3. 达梦数据库dmrman备份与还原(一)
  4. 【详解】电子老鼠走迷宫问题
  5. linux中文字体安装
  6. STK与C#联合编程
  7. 知识:财富的丰富源泉
  8. 虚拟服务器申请流程,虚拟主机申请流程
  9. 东方音图英语教学系统服务器,东方音图英语教育理念.ppt
  10. Ruby 第三方库集锦