npm 的几个坑
随着 nodejs 发布 5.x.x 稳定版,npm3 也踏坑而来,带来了传说中的 flat dependencies
: 如果没有版本冲突的话,它会把所有的依赖压成一层
没冲突的情况下,比如模块依赖关系是这样的:
|--a@1.0.0
| |--b@1.0.0
|
|--b@1.0.0
安装后的项目结构是这样的:
|--node_modules
|--a@1.0.0
|--b@1.0.0
有冲突的情况下,比如:
|--a@1.0.0
| |--b@2.2.2
|
|--b@1.0.0
安装后的项目结构是这样的:
|--node_modules
|--a@1.0.0
| |--node_modules
| |--b@2.2.2
|
|--b@1.0.0
仔细想想,以后大家的 node_modules 目录可能就没那么干净了,什么乱七八糟的深层依赖都会跑到上面来,不过这样经过排重后需要下载的代码量也会大大缩减吧,并且 npm 官网上统计的各个流行模块的惊人下载量也会急剧下降吧
上面提到的模块版本冲突的问题,有些组件的依赖并不是直接写死了版本号,而是类似于 ^0.0.1
~0.0.1
这种情况,如果是这种模糊版本号,并且两个组件的版本号在同一范围内,也会被认为是同一个依赖而被压平的
~
比较好理解,就是最后一位版本号模糊:
~1.2.3
: >=1.2.3 && <1.3.0
~1.2
: >=1.2.0 && <2.0.0
^
比较蛋疼,看下面三个例子或许就理解了:
^1.2.3
: >=1.2.3 && <2.0.0
^0.2.3
: >=0.2.3 && <0.3.0
^0.0.3
: >=0.0.3 && <0.0.4
总之,就是小于非 0 最高位的那位数 +1 (还是英文好解释 “Compatible with version” )
更多规则请移步这里