假设我们有以下情况。您正在致力于
cool-app
并依赖于 react
和 cool-package
:
"dependencies": {
"react": "^16.0.0",
"cool-package": "^1.0.0"
}
不幸的是,您仍然使用 React 16 而不是 18。
cool-package
另一方面,具有 React 18 的对等依赖:
"peerDependencies": {
"react": "^18.0.0",
}
在 npm 版本 4、5 和 6 中,如果您尝试在
npm install
中进行 cool-app
,您将收到有关未满足对等依赖项的警告。这是因为 cool-app
没有提供满足 react
版本要求的 ^18.0.0
版本。
如果
cool-package
对 react
有常规依赖(不是对等依赖),并且版本要求为 ^18.0.0
,则当您在 npm install
中使用 cool-app
时,将会下载 react
的第二个版本cool-app
拥有的React v16无法满足^18.0.0
的cool-package
要求。
但是,在 npm v7(以及自(1,2)以来的每个版本)中,对等依赖关系的行为发生了变化。如果尚未满足对等依赖项,当您
npm install
时,它不会显示警告,而是安装缺少的依赖项,就像使用常规依赖项而不是对等依赖项时所做的那样。
因此,在我们的
cool-app
示例中,如果我们使用 npm 7,cool-app
将拥有两个不同版本的 React:v16 和 v18,即使 cool-library
使用对等依赖项。
鉴于此,我不清楚常规依赖项和对等依赖项之间有什么区别,以及这些区别在实践中有多重要。
背景:这个是导致我产生这些问题的对话。
如果尚未满足对等依赖项,则在 npm install 时不会显示警告,而是安装缺少的依赖项,
这不是我在这里读到的:
在以前版本的 npm (4-6) 中,对等依赖项冲突会发出版本不兼容的警告,但仍会安装依赖项而不会出现错误。这就是我所经历的。如果您的代码库中有一个依赖项与您安装的依赖项的对等依赖项不匹配,则它不会安装该对等依赖项,而是会失败,这是一个更好的行为,IMO。如果存在无法自动解决的上游依赖冲突,npm 7 将阻止安装