随着 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” )
更多规则请移步这里