我们都知道npm cnpm yarn 但是在最近出现的pnpm 为什么pnpm会这么爆火,有的人说,pnpm会碾压npm和yarn?下面的来谈一下 npm yarn 和pnpm的区别。
npm
npm是最常见的一个包管理器,这个我们就不多介绍了,我们来说他的不足之处:
1.在npm2.x版本中,通过的npm2.xnpm2 的 node_modules 是嵌套的,这样其实是有问题的,多个包之间难免会有公共的依赖,这样嵌套的话,同样的依赖会复制很多次,会占据比较大的磁盘空间,同时我们删除依赖的时候,我们会发现,依赖嵌套太深的话,我们无权限或者一次性删除。
2.高于npm2.x版本虽然解决了这个问题,依赖铺平了。所有的依赖不再一层层嵌套了,而是全部在同一层,这样也就没有依赖重复多次的问题了,也就没有路径过长的问题了
yarn
yarn的出现是为了解决npm2.x依赖重复很多次,嵌套路径过长的问题的,虽然高版本npm已经解决了这个问题,但是高版本npm和yarn出现另外一个问题就是幽灵依赖。什么幽灵依赖呢?
通俗理解:dependencies 里的依赖,但在代码里却可以 require 进来,这个很容易理解,因为都铺平了,那个依赖的依赖也都是可以找到的。但是这样是有隐患的,因为没有显式依赖,万一有一天别的包不依赖这个包了,那你的代码也就不能跑了,因为你依赖这个包,但是现在不会被安装了。这个就是典型的幽灵依赖的问题。
而且还有一个问题,就是上面提到的依赖包有多个版本的时候,只会提升一个,那其余版本的包不还是复制了很多次么,依然有浪费磁盘空间的问题
pnpm
pnpm的出现就是为了解决 npm和yarn遗留的问题。可以很好的解决一下幽灵依赖的问题。那我们来说一下pnpm的实现原理:
回想下 npm3 和 yarn 为什么要做 node_modules 扁平化?不就是因为同样的依赖会复制多次,并且路径过长在 windows 下有问题么?
那如果不复制呢,比如通过 link。
首先介绍下 link,也就是软硬连接,这是操作系统提供的机制,硬连接就是同一个文件的不同引用,而软链接是新建一个文件,文件内容指向另一个路径。当然,这俩链接使用起来是差不多的。
这样不会有复制多次的磁盘空间浪费,而且也不会有路径过长的问题。因为路径过长的限制本质上是不能有太深的目录层级,现在都是各个位置的目录的 link,并不是同一个目录,所以也不会有长度限制。
再把 node_modules 删掉,然后用 pnpm 重新装一遍,执行 pnpm install。
你会发现它打印了这样一句话:
除此之外 使用pnpm的动机
节省磁盘空间
提高安装速度
pnpm 分三个阶段执行安装:
1.依赖解析。 仓库中没有的依赖都被识别并获取到仓库。
2.目录结构计算。 node_modules 目录结构是根据依赖计算出来的。
3.链接依赖项。 所有以前安装过的依赖项都会直接从仓库中获取并链接到 node_modules。
安装和兼容性
npm install -g pnpm
功能比较
cli命令
查看依赖项
运行脚本
具体可以查看官方文档https://pnpm.io/zh/installation