peerDependency到底是什么

news2024/10/3 2:24:12

peerDependency到底是什么

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

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

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

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

.
├── helloWorld
│   └── node_modules
│       ├── packageA
│       ├── plugin1
│       │   └── nodule_modules
│       │       └── packageA
│       └── plugin2
│       │   └── nodule_modules
│       │       └── packageA

从上面的依赖图可以看出,helloWorld 本身已经安装了一次 packageA,但是因为因为在 plugin1 和 plugin2 中的 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 的作用;

 

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/836075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java+springboot+mysql法律咨询网

项目介绍: 使用javassmmysql开发的法律咨询网,系统包含超级管理员,系统管理员、用户角色,功能如下: 用户:主要是前台功能使用,包括注册、登录;查看法律领域;法律法规&a…

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具,用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间,最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新,同时也增加了一些实用的功能。 主要更新 更新了基础依…

C语言 用数组名作函数参数

当用数组名作函数参数时,如果形参数组中各元素的值发生变化,实参数组元素的值随之变化。 1.数组元素做实参的情况: 如果已经定义一个函数,其原型为 void swap(int x,int y);假设函数的作用是将两个形参(x,y&#xf…

云运维工具

企业通常寻找具有成本效益的方法来优化创收,维护物理基础架构以托管服务器和应用程序以提供服务交付需要巨大的空间和前期资金,最重要的是,物理基础设施会产生额外的运营支出以进行定期维护,这对收入造成了沉重的损失。 云使企业…

降维 — PCA 真的能改善分类结果吗?

一、说明 我遇到了一些关于降维技术的资源。这个主题绝对是最有趣的主题之一,很高兴认为有一些算法能够通过选择仍然代表整个数据集的最重要的特征来减少特征的数量。作者指出的优点之一是这些算法可以改善分类任务的结果。 在这篇文章中,我将使用主成分…

在线免费做分班查询软件:这个制作分班查询系统的平台就可实现

在制作分班查询系统前,作为老师的我们可以先理清制作分班查询系统的意义!这几个要点可能很多老师都没有留意过! 提高工作效率: 学校每年都需要进行学生的分班工作,如果采用传统的手工方式进行分班查询,会…

防火墙规则分析管理

防火墙规则在高效的网络安全管理中起着至关重要的作用,在添加规则之前,确保提议的新规则不会对网络产生负面影响至关重要。 通过防火墙规则影响分析,安全管理员可以详细了解添加新规则的可能影响,防火墙规则影响分析的一个重要方…

假日购物季已经打响?卖家要提前行动起来啦!

去年,假日购物季比以往任何时候都要早开启,这促使消费者对今年的购物季抱有更多的期待。 根据Optimove最新的消费者调查,有一半的消费者(50%)计划在11月之前开始他们的假日购物。 当被问及是什么促使他们提前购买时&…

【已解决】安装win7系统,“Windows安装程序无法将Windows配置在此计算机的硬件上运行”

问题: 安装windows7时报错:“Windows安装程序无法将Windows配置在此计算机的硬件上运行” 解决办法: 方法一 shiftF10 调出命令提示行,输入cd oobe 然后再输入msoobe 回车,就可以继续进行下一步了。 如果方法一不…

你知道充电桩控制主板的结构吗?

你知道充电桩控制主板的结构吗? 你是否曾经遇到过电动车行驶途中突然没电的情况?不用担心,解决这个问题的方法之一就是使用充电桩。那么,控制主板是如何控制充电桩的呢?让我们一起来探究一下。 充电桩控制主板由多种元件组成,包括主控芯片…

亚马逊Q2业绩呈井喷式增长,净销售额高达1344亿美元

周四(8月3日),亚马逊公布了截至6月30日的2023年第二季度财务业绩。在电商、云和广告销售强劲的推动下,该电商巨头的利润出现井喷式增长。周四盘后交易中,亚马逊股价上涨逾7%。 财报显示,在截至6月30日的这…

linuxARM裸机学习笔记(3)----主频和时钟配置实验

引言:本文主要学习当前linux该如何去配置时钟频率,这也是重中之重。 系统时钟来源: 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核 和其它外设的时钟源 1. 7路PLL时钟源【都是从24MHZ的晶振PLL而来…

LeetCode112. 路径总和

112. 路径总和 文章目录 [112. 路径总和](https://leetcode.cn/problems/path-sum/)一、题目二、题解方法一:递归存储各个路径之和方法二:递归版本2简化版本 一、题目 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 …

回调函数的简单用例

列举项目中一个简单的回调函数用例 ①用MsgInterface_t定义一个结构体s_Lin_MsgInterface,包含两个回调函数成员: ②确定结构体下的回调函数成员的参数: ③传入实参,确定结构体下的回调函数成员的函数名: ④最终回…

docker容器互联详解

目录 docker容器互联详解 一、容器互联概述: 二、案例实验: 1、用户自定义的网络: 2、查看当前的IP信息: 3、启动第三个容器: 4、查看三个容器内部的网络: 5、Ping测试: Ps备注&#x…

CVE-2008-5161

SSH服务器CBC加密模式漏洞 1.描述 一般经过我们的加固,Linux环境中一般都已经采用AES这种算法加密,AES有五种加密模式(CBC、ECB、CTR、OCF、CFB),centos7.x系统启动sshd服务后,系统默认选择CBC的机密模式…

div上下左右居中几种方式

div固定宽高 div{width:200px;height:200px;background-color:red; }1、绝对定位&#xff08;常用于登录模块&#xff09; 备注&#xff1a;前提条件div需要有宽高 #html <div class"box"></div> #css .box{ position:absolute/fixed; left:0; right:0…

凯迪正大—SF6泄漏报警装置的主要特点

SF6泄漏报警系统主要特点 ① 系统采用声速原理&#xff0c;可定量、实时在线测量SF6泄漏气体含量&#xff0c;克服了传统测量方法如负电晕放电法和卤素传感器法只能定性判别是否越限的缺陷&#xff0c;能够准确得到气体中SF6含量。 ② 系统采用双差分处理方法&#xff0c;有效…

Linux知识点 -- 进程间通信(一)

Linux知识点 – 进程间通信&#xff08;一&#xff09; 文章目录 Linux知识点 -- 进程间通信&#xff08;一&#xff09;一、了解进程间通信1.进程间通信的必要性2.进程间通信的技术背景3.进程间通信的本质理解4.进程间通信的标准 二、匿名管道1.匿名管道通信的原理2.匿名管道的…

Docker网络模型详解

目录 一、Docker网络基础 1.1、端口映射 1.2、端口暴露 1.3、容器互联 二、Docker网络模式 2.1、Host模式 2.2、container模式 2.3、none模式 2.4、bridge模式 2.5、Overlay模式 网络是激活Docker体系的唯一途径&#xff0c;如果Docker没有比较出色的容器网络&#xff0…