ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

-legacy-peer-deps 包依赖管理

2022-01-24 11:02:33  阅读:820  来源: 互联网

标签:插件 plugin2 packageA modules legacy plugin1 deps peer peerDependencies


小结:

1)

 npm install --force

 

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

 

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

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

image.png

正常开发中,我们经常接触到的是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 的作用; image.png

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

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

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



标签:插件,plugin2,packageA,modules,legacy,plugin1,deps,peer,peerDependencies
来源: https://www.cnblogs.com/rsapaper/p/15838601.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有