代码之家  ›  专栏  ›  技术社区  ›  Adam Zerner

为什么在npm 7之后使用对等依赖关系而不是常规依赖关系?

  •  -1
  • Adam Zerner  · 技术社区  · 2 年前

    假设我们有以下情况。你正在工作 cool-app 并依赖 react cool-package :

    "dependencies": {
      "react": "^16.0.0",
      "cool-package": "^1.0.0"
    }
    

    不幸的是,你仍然在React 16上,而不是18。 冷包装 另一方面具有React 18的对等依赖性:

    "peerDependencies": {
      "react": "^18.0.0",
    }
    

    在npm版本4、5和6中,如果您尝试 npm install 在里面 酷的应用程序 ,您将收到关于未满足的对等依赖关系的警告。这是因为 酷的应用程序 不提供的版本 反应 满足的版本要求 ^18.0.0 .

    如果 冷包装 而是有一个常规依赖项(而不是对等依赖项) 反应 版本要求为 ^18.0.0 ,当你 npm安装 在里面 酷的应用程序 ,的第二个版本 反应 将从React的v16开始下载 酷的应用程序 无法满足 ^18.0.0 的要求 冷包装 .

    然而,在npm v7(以及此后的每个版本( 1 , 2 )),对等依赖关系的行为发生了变化。如果没有满足对等依赖关系,而不是在 npm安装 ,它将安装丢失的依赖项,就像使用常规依赖项而不是对等依赖项一样。

    所以在我们的例子中 酷的应用程序 ,如果我们使用的是npm 7, 酷的应用程序 将有两个不同版本的React:v16和v18,尽管 cool-library 使用对等依赖关系。

    鉴于此,我不清楚常规依赖和对等依赖之间的区别,以及这些区别在实践中的重要性。

    上下文 This 正是这段对话让我产生了这些问题。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Adam Jenkins    2 年前

    如果对等依赖项没有得到满足,则npm安装时不会显示警告,而是安装丢失的依赖项,

    不是这么说的 here :

    在以前的npm版本(4-6)中,对等依赖关系冲突会发出警告,即版本不兼容,但仍然会安装依赖关系而不会出错。 如果存在无法自动解决的上游依赖冲突,npm7将阻止安装

    这就是我所经历的。如果你的package.json中有一个依赖项,其版本无法与你正在安装的依赖项的peerDependency相协调,它不会安装该peerDependency,而是无法安装该依赖项,这是一种更好的行为,IMO。

    因此,在我们的酷应用程序示例中,如果我们使用npm 7,那么酷应用程序将有两个不同版本的React:v16和v18,尽管酷库使用对等依赖关系。

    这是不正确的。如果 cool-app 有反应 ^16 已安装,您尝试安装 cool-package 依赖于react ^18 -它失败了——这是一场无法解决的冲突。

    在里面 the answer 你会注意到:

    在版本7中,peerDependencies会自动安装 除非存在无法自动解决的上游依赖关系冲突