相比于npm和yarn,pnpm的优势是撒?

文章类型:Javascript

发布者:hp

发布时间:2022-10-19

npm主要的问题是

1:node_modules是嵌套的,如果多个包都依赖某个包,可想而知,就会疯狂的复制到每个包里面,占据更多的磁盘空间

2:系统文件路径长度最大260个字符,如果多层次嵌套,就会超过长度限制

yarn的问题是,

1:采用扁平化的方案,直接平铺包,解决了npm疯狂复制问题,但是只提升了一层,如果遇到相同包的不同版本,还是采用嵌套的方式,又陷入npm的问题上,

2:产生幽灵依赖,包平铺后,依赖的依赖是可以找到的,如果没有显示的依赖,万一某天某个包不用,就会影响到你依赖的包,如果 A 依赖 B, B 依赖 C,那么 A 当中是可以直接使用 C 的,但问题是 A 当中并没有声明 C 这个依赖。因此会出现这种非法访问的情况

所以,pnpm就出现了,他主要就是解决幽灵依赖和磁盘占用浪费的问题以及路径超长限制问题, 同时,因为没有疯狂复制,相同配置下载文件更少,也就速度更快

1:采用软硬连接方式,系统提供的机制,硬连接就是同一个文件的不同引入,通过索引节点来进行连接,软连接就是新建一个文件,文件内容执行另外一个路径,通过符号来进行连接

2:全局 store 硬连接到 node_modules/.pnpm,然后通过软链接组织依赖关系,包的依赖项与依赖包的实际位置位于同一目录级别

3:.pnpm/以平铺的形式储存着所有的包,都可以通过.pnpm/<name>@<version>/node_modules/<name>虚拟存储目录找到

4:.pnpm/依然是平铺所有的包,真实位置在.pnpm/包/node_modules,避免了项目中跨声明访问

5:pnpm 还额外的使用了内容寻址的文件系统来存储依赖文件。当遇到两个版本a模块依赖,但两个版本之前只有一个文件存在差异时,pnpm 只会新增一个差异文件,最大化的提升文件存储效率

node_modules/express/...  //只是个软连接,会形成一个到第二个目录文件的链接,类似快捷方式
node_modules/.pnpm/express@4.17.1/node_modules/xxx //真实文件路径

官方原理图