NPM是否支持同一依赖多版本共存?依赖版本冲突场景规则问询
执行npm install后的实际Lodash版本情况
npm v3及以上版本默认采用依赖优先提升规则,会尽可能把所有依赖提升到项目根目录的node_modules下复用,只有版本冲突时才会把不兼容的版本下沉到对应依赖包的私有node_modules目录里:
- 如果PackageWithPossibleCollision自身没有声明Lodash依赖,首次安装时会优先把先被解析到的Lodash版本放到根
node_modules,另一个冲突版本会下沉到对应依赖包的node_modules中:- 若先解析到PackageA的依赖,根目录存Lodash@3.6.0,PackageB的私有
node_modules存Lodash@4.17.21,两者分别使用自己声明的对应版本 - 若先解析到PackageB的依赖,根目录存Lodash@4.17.21,PackageA的私有
node_modules存Lodash@3.6.0,两者仍然分别使用自己声明的对应版本
- 若先解析到PackageA的依赖,根目录存Lodash@3.6.0,PackageB的私有
- 不管解析顺序如何,最终PackageA和PackageB都会加载到自身依赖声明指定的Lodash版本,不会出现版本混用的情况。第一次安装生成
package-lock.json后,后续再次执行npm install的版本解析结果就会被锁死,不会再受解析顺序影响。
和Maven依赖规则的区别
两者逻辑完全不同:
Maven采用路径最近优先、声明顺序优先的仲裁规则,整个项目中同一个依赖只能保留一个版本,所有依赖共享该版本,可能出现低版本包被迫用高版本依赖导致兼容性问题。
而npm没有统一仲裁为单版本的逻辑,只要版本冲突就会分别保留不同版本,不会强制所有依赖共用同一个版本。
是否允许同个项目内存在同一依赖的多个版本
允许。npm的依赖树设计本身就支持多版本共存,不同的依赖包可以分别加载自己需要的对应版本依赖,互相不会干扰。
内容的提问来源于stack exchange,提问作者Brian K
相关产品推荐
相关产品推荐

