幽灵依赖的出现和npm的发展存在一定关系。
早起的npm1,2都是链式下载相关依赖,虽然链式解决了子依赖版本冲突问题,但是仍然无法重复使用相同版本依赖,并且会导致文件路径过长无法解析等问题(路径地址长度一般处理260多位)
如下图所示:
为了解决无法重复使用相同版本依赖问题,npm3推出了扁平化解决方案,通过将相关子依赖提升来解决问题。npm3虽然解决了重复版本依赖问题,但是随之带来的是幽灵依赖问题,什么是幽灵依赖这里假如前端开发项目中引用了A库,A库引用了B库,B库引用了C库,由于npm3的特性会将B和C进行扁平化处理,导致我们在项目制可以不安装B和C的情况下直接使用B和C库,如果当A库更新以后不使用B库,那么我们开发的项目就会出现B,C库报错问题。
如下图所示:
如何解决幽灵依赖:目前并没有特别好的方法去解决幽灵依赖,只能尽量避免,不过我们可以使用pnpm实现幽灵依赖的一些规避。