yarn多级包依赖不同版本的组件,最终到底会怎么安装?

一、背景

在开发项目的时候,偶然间发现一个现象:

项目依赖packageA和packageB,而packageB也依赖packageA。正常来说,我们理解到的是只需要在项目依赖中安装packageA就可以了,packageB会直接使用项目中已安装的packageA。那么事实真的是这样么???

如下图:

显然不是我们想象的那样,我们发现在 packageB下也安装了packageA,这是为什么呢,当时是觉得不太理解。经过调研后,发现项目的packageA的版本是0.3.0,而packageB依赖的packageA版本却是0.4.0版本,在向上找的时候,发现版本并不匹配,所以只能够自己进行安装.

简单的举个不恰当的例子:你参加运动会需要穿运动鞋,但是这个时候你没有运动鞋,可是你发现你的室友有运动鞋,你想去穿她的,发现她的鞋子是36的或者38的,而你是37的脚,所以这个时候你就只能自己买一双37码的鞋子;如果她的鞋子刚刚好是37的,那么你就不需要自己买鞋子而直接穿她的就可以。不知道这样举例子,大家能不能听得明白,emm~

二、yarn版本安装多种场景详解

场景一:

packageA@1.0.0 依赖 packageB@1.0.0

结论:由于npm是扁平化管理,所以packageA和packageB会安装到同一层级

 场景二:

packageA@1.0.0 依赖 packageB@1.0.0,packageC@1.0.0 依赖 packageB@2.0.0

结论:由于根目录下已存在 packageB@1.0.0,所以npm 会把packageB@2.0.0 安装到 packageC 依赖的 node_modules 里。

场景三:

packageA@1.0.0 依赖 packageB@1.0.0,packageC@1.0.0 依赖 packageB@2.0.0。安装 packageD@1.0.0,而它也依赖 packageB@2.0.0

结论:同样的,由于根目录下已存在 packageB@1.0.0 的依赖,所以npm会把packageB@2.0.0 安装到 packageD@1.0.0 依赖的 node_modules里。

 场景四:

在场景三的基础上,我们再安装 packageE@1.0.0,它依赖 packageB@1.0.0

结论: 由于顶级的node-mudules中已经安装了packageB@1.0.0,所以会跳过安装,直接使用

场景五:

如果更新 packageA@1.0.0为packageA@2.0.0,同时它依赖是 packageB@2.0.0。

结论: npm的执行顺序是,删除 packageA@1.0.0,安装 packageA@2.0.0,并在packageA下安装packageB@2.0.0,留下了 packageB@1.0.0 在顶层目录

 场景六:

如果在上述基础上,更新 packageE@1.0.0为 packageE@2.0.0,同时它依赖packageB@2.0.0。

结论:那么 npm的执行顺序是,删除 packageE@1.0.0,安装packageE@2.0.0,删除 packageB@1.0.0,安装packageB@2.0.0

 

由上图可以看出来,存在四个packageB@2.0.0,并且分布在不同的node-modules中,按照我们上面说的,这个时候应该只需要留有顶层node-modules中的packageB@2.0.0就可以了。那么为什么会出现上图这种结构呢?这是由于npm顺序执行的问题造成的,这时候如果你把node-modules删掉,重新进行安装,你就会得到非常清晰的结构,如下图:

 

本篇文章到这里就结束啦,欢迎留言讨论~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值