这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
npm处理依赖与依赖冲突
在npm(v2)以及之前的版本中,npm处理依赖的方式是通过递归,依次安装模块的依赖,以此形成一颗庞大的依赖树。这个机制可以解决依赖包的冲突问题,但是也会导致以下问题:
1.依赖的层级过深,删除缓慢。
2.不同的模块会依赖相同的包,有冗余,甚至可能造成bug
依赖共享与冲突
在项目中可能出现项目依赖A包和B包,同时B包依赖A包的情况。
npm v2首先会判断A包是否兼容,如果兼容就只会在项目路径下安装A包,若不兼容则会在B包中再安装一个A包
在 npm v3 版本之后,npm 采用了更合理的方式去解决之前的依赖地狱的问题。npm v3 尝试把依赖以及依赖的依赖都尽量的平铺在项目根目录下的 node_modules 文件夹下以共享使用;如果遇到因为需要的版本要求不一致导致冲突,没办法放在平铺目录下的,回退到 npm v2 的处理方式,在该模块下的 node_modules 里存放冲突的模块。
例如,当前项目有依赖的模块 A@1.0.0, B@1.0.0, A@1.0.0 依赖于模块 C@1.0.0, D@0.6.5, B@1.0.0 又依赖于模块 C@2.0.0, E@1.0.3。注意,此时由于模块 C 的两个版本 C@1.0.0 和 C@2.0.0 被分别依赖,鉴于模块在同一个 node_modules 目录中是按照模块名目录存放,因此这两个版本没办法同时平铺在同一目录,因此,其中一个版本的 C 模块将会以 npm v2 的处理方式放入子 node_modules 目录中。
存在的问题
如果A包在window下注册对象,会出现冲突
peerDependencies
当一个依赖模块X定义在peerDependencies中而不是devDependencies或dependencies中时,依赖该模块的项目就不会自动下载该依赖。