我们都知道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被提升到根目录了
先安装@airshaos/b,后安装@airshaos/a
- 安装完@airshaos/b, node_modules目录结构如下所示。
- 再安装@airshaos/a, node_modules目录结构如下所示。
通过上面两个截图图,我们可以发现,@airshaos/d@0.2.0先被提升,然后@airshaos/d@0.1.0被提升,把之前的@airshaos/d@0.2.0覆盖掉。
结论
yarn的子依赖提升安装顺序无关,同一包的不同版本并不是谁先提升,谁就先把node_modules的根目录占了。由此可以推断出一个结论,无论yarn add的顺序,yarn都会先检查整个项目的依赖关系,然后决定应该把哪个版本的子依赖提升到根目录