使用npm或者yarn安装包的过程中,node_modules会采取拍平安装(npm3)
比如A依赖B,B依赖C,那么ABC三个包都会装到node_modules目录下
这就会造成一个问题——依赖提升
A包里面能够直接用C包的东西(A包的作者如果图方便)
A包查找的逻辑是:当前目录的node_modules->上级目录的node_modules
由于拍平了,C包的东西是都在上级目录的node_modules中,所以能够访问到
但是此时有个问题
如果B包的作者更新了C包的依赖,但是A包的作者没有及时更新,还是用旧的写法,就会造成错误。
或者B包的作者删除了C包,A包没有更新也会报错。
这就相当于把项目一部分交给别人维护了
和npm不同,pnpm采用了软链接
A包依赖B,所以A包的目录会是这样
▾ node_modules
▾ .pnpm
▾ A@xxx版本
▾ node_modules
▸ A
▸ B
B在A的node_modules下也是软链接,真实指向的地址是
▾ node_modules
▾ .pnpm
▾ B@xxx版本
▾ node_modules
▸ B
▸ C
这个时候当A调用C的api时,是找不到的,会直接报错,因为A的上级node_modules并没有C,C只存在B的node_modules之中
所以如果遵守pnpm包的开发规范,A的作者想要用C的话,还是需要在dependencies申明C,而不能导入B后直接调用C