选用两个包,jquery-dreamstream(以下简称jq-d)和jquery.tree(以下简称jq-t),他们的dependency都只有jquery(以下简称jq)一个包
测试的时候,jq-d的dependency为jq@^2.1.1,jq-t的dependency为jq@~2.1.1。其中jq@^2.1.1的最高兼容版本为2.2.4,jq@~2.1.1的最高兼容版本为2.1.4,两者交集最高兼容版本为2.1.4
1.npm
- 表现:
(1).生成了package-lock.json,结构为:
dependencies: {
jq: 2.2.4,
jq-d: xxx(xxx为jq-d自身版本,这里不需要关心这个问题,所以后文省略,jq-t同),
jq-t: {
dependencies: {
jq: 2.1.4
}
}
}
(2).下载了三个目录,jq,jq-d,jq-t
其中jq的版本为2.2.4,jq-d内无node_modules目录,但jq-t内有node_modules目录,里面有一个2.1.4的jq
- 整体结构:
├ jq@2.2.4
├ jq-d
├ jq-t
├ jq@2.1.4
- 推测:解析依赖后发现jq-d最高兼容jq版本2.2.4高于jq-t的2.1.4,所以把2.2.4放到了外面的第一层来,然后把2.1.4放到了jq-t自己目录的node_modules里。
2.cnpm
- 表现:
node_modules目录里出现了7个目录,4个真实目录,3个软链接
4个真实目录:_jq-d,_jq-t,_jq@2.1.4,_jq@2.2.4
3个软链接:jq -> _jq@2.2.4,jq-d -> _jq-d,jq-t -> _jq-t
- 整体结构
├ _jq-d
├ _jq-t
├ _jq@2.1.4
├ _jq@2.2.4
├ jq
├ jq-d
├ jq-t
可以看出相比npm,cnpm的node_modules只有一层,把各个非直接install的第三方包都放到了最顶层的node_modules里
- 推测:
将依赖树从第二层开始的子节点全部移到第一层,把树形结构变成平的一层
3.yarn
- 表现
(1).生成了yarn.lock文件,锁了4个包:jq-d,jq-t,jq@2.2.4,jq@2.1.4(和npm的package-lock.json比较类似,只是把前者的树形结构展开成一层了)
(2).目录同npm
- 整体结构同npm
- 推测:只是单纯的把npm的依赖树展开,锁各个包版本
疑问:为什么在解析jq-d和jq-t的依赖的时候,不取两个交集的最高兼容版本2.1.4,要分别下载各自的最高兼容版本,也就是下了两个版本的jq?如果只下一个2.1.4,然后同时给两个包用,会出现什么问题?
来自so的回答: