• 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删掉,重新进行安装,你就会得到非常清晰的结构,如下图:

     

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

  • 相关阅读:
    Python获取 小黑子 弹幕数据+制作词云分析.........
    虹科Q&A | SWCF2022 11月29日演讲笔记:卫星传输链路中的关键技术分享
    【MySQL 系列】在 CentOS 上安装 MySQL
    阿里内部人手一份!P8大佬也叫好的 高性能MySQL系列
    jar包做成Windows Service 服务,不能访问网络映射磁盘
    INTERSPEECH 2022 | 钉钉蜂鸣鸟音频实验室论文入选国际顶会,创新提出窄带滤波网络架构
    Muduo网络库之Channel、EPollPoller与EventLoop类【深度解析】
    Kubernetes资源对象解读之基于HPA实现Pod的自动扩缩容
    你知道吗?小程序组件≠小程序插件
    二极管:Irush与我相干!
  • 原文地址:https://blog.csdn.net/rolinabc/article/details/127688884