-legacy-peer-deps 包依赖管理

小结:

1)

 npm install --force

 

【前端开发技巧】npm install xxxx --legacy-peer-deps到底做了些什么? - 掘金 https://juejin.cn/post/6971268824288985118

 

下面,我就结合我现有的理解实践进行分析解答:

在理解 --legacy-peer-deps 做了什么前,我们先来了解一下peerDependency

-legacy-peer-deps 包依赖管理

正常开发中,我们经常接触到的是package.json中的dependenciesdevDependencies, 本文不对上面两个进行细节分析,让我们来看看peerDependencies是什么?

Dependencies: Libraries or modules that an NPM module needs in order to work in production.

peerDependencies: A peer dependency is a specific version or set of versions of a third-party software library that a module is designed to work with. They're similar in concept to the relationship between a browser extension and a browser.

在NPM v7中,默认安装peerDependencies,在我们日常使用的插件例如babel-plugin-dynamic-import-nodebabel-plugin-transform-vue-jsxlottie-web,它们都依赖于webpack进行开发的。

peerDependencies在我们的日常开发当中到底承担一个怎样的角色呢?

举个例子 【借鉴】

假设现在有一个helloWorld工程,已经在其package.jsondependencies中声明了 packageA,有两个插件plugin1plugin2他们也依赖 packageA,如果在插件中使用dependencies而不是peerDependencies来声明 packageA,那么npm install安装完plugin1plugin2之后的依赖图是这样的:

.
├── helloWorld
│   └── node_modules
│       ├── packageA
│       ├── plugin1
│       │   └── nodule_modules
│       │       └── packageA
│       └── plugin2
│       │   └── nodule_modules
│       │       └── packageA
复制代码

从上面的依赖图可以看出,helloWorld 本身已经安装了一次packageA,但是因为因为在 plugin1plugin2 中的 dependencies 也声明了 packageA,所以最后 packageA 会被安装三次,有两次安装是冗余的。

peerDependency 就可以避免类似的核心依赖库被重复下载的问题。 如果在 plugin1 和 plugin2 的package.json中使用peerDependency来声明核心依赖库,例如:

plugin1/package.json

{
  "peerDependencies": {
    "packageA": "1.0.1"
  }
}
复制代码

plugin2/package.json

{
  "peerDependencies": {
    "packageA": "1.0.1"
  }
}
复制代码

在主系统中声明一下 packageA:

helloWorld/package.json

{
  "dependencies": {
    "packageA": "1.0.1"
  }
}
复制代码

此时在主系统中执行npm install生成的依赖图就是这样的:

.
├── helloWorld
│   └── node_modules
│       ├── packageA
│       ├── plugin1
│       └── plugin2
复制代码

可以看到这时候生成的依赖图是扁平的,packageA 也只会被安装一次。

因此我们总结下在插件使用dependencies声明依赖库的特点:

  • 如果用户显式依赖了核心库,则可以忽略各插件的peerDependencies声明;
  • 如果用户没有显式依赖核心库,则按照插件peerDependencies中声明的版本将库安装到项目根目录中;
  • 当用户依赖的版本、各插件依赖的版本之间不相互兼容,会报错让用户自行修复。

--legacy-peer-deps 的作用

在理解peerDependencies的功能后,让我们来看看 --legacy-peer-deps 的作用; -legacy-peer-deps 包依赖管理

上面讲过,在NPM v7中,现在默认安装peerDependencies

在很多情况下,这会导致版本冲突,从而中断安装过程。

--legacy-peer-deps标志是在v7中引入的,目的是绕过peerDependency自动安装;它告诉 NPM 忽略项目中引入的各个modules之间的相同modules但不同版本的问题并继续安装,保证各个引入的依赖之间对自身所使用的不同版本modules共存。



上一篇:Hyperledger Fabric交易流程


下一篇:AntDesign 学习笔记(二)axios使用