热搜:前端 nest neovim nvim

npm install --legacy-peer-deps 是什么?

lxf2023-05-15 01:08:55

相信大家在日常开放中使用最多的是 package.json 文件里的 devDependencies(用于在开发环境下依赖的模块)和 dependencies(无论开发环境还是生产环境都需要的依赖模块)这两个字段,而 --legacy-peer-deps 和另一个相似的的字段 peerDependency 有联系。它的定义是:

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,它在每个项目中都很常见,运行方式相似。

我们举个例子来说明:

假设我们现在有一个 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就不会发生这个错误)

--legacy-peer-deps 命令就是用于绕过 peerDependency 里的依赖的自动安装;告诉 npm 忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题,以npm v3-v6 的方式去继续执行安装操作。从而绕过子项目依赖的包版本相互不兼容的问题;

那在什么情况下用到呢

一般来说,peerDepenedencies 是在开第三方库,也就是 npm 包的时候会常用到,例如:

开发 react 项目相关的业务组件,会在这个业务组件的 package.json 的 peerDepenedencies 加上 react ,来告诉使用的项目方,我这个业务组件需要项目里安装 react (项目的 package.json 的 dependences 中加入 react)。

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!