yarn子依赖提升与依赖安装顺序无关

369 阅读1分钟

我们都知道yarn安装依赖的时候会尽可能的让依赖扁平化,这可以最大程度的避免node_modules里面的依赖的深层嵌套。扁平化主要是通过提升最大兼容版本的子依赖到node_modules根目录来实现的。

那么现在就有一个问题,yarn的子依赖提升会和依赖的安装顺序有关系吗?我打算想做一个简单的实验来看看

我准备了3个依赖包@airshaos/a,@airshaos/b,@airshaos/d, 他们的依赖关系如下所示

|-- @airshaos/a (1.0.0)  
|   |-- @airshaos/d (0.1.0)  
| 
|-- @airshaos/b (1.0.0)  
|   |-- @airshaos/d (0.2.0)  

先安装@airshaos/a,后安装@airshaos/b

yarn add @airshaos/a && yarn add @airshaos/b

会发现@airshaos/d@0.1.0被提升到根目录了

image.png

先安装@airshaos/b,后安装@airshaos/a

  1. 安装完@airshaos/b, node_modules目录结构如下所示。

image.png

  1. 再安装@airshaos/a, node_modules目录结构如下所示。

image.png

通过上面两个截图图,我们可以发现,@airshaos/d@0.2.0先被提升,然后@airshaos/d@0.1.0被提升,把之前的@airshaos/d@0.2.0覆盖掉。

结论

yarn的子依赖提升安装顺序无关,同一包的不同版本并不是谁先提升,谁就先把node_modules的根目录占了。由此可以推断出一个结论,无论yarn add的顺序,yarn都会先检查整个项目的依赖关系,然后决定应该把哪个版本的子依赖提升到根目录