npm与yarn的区别

  • npm基于队列install,而yarn是并行安装,所以在安装速度上,yarn更快。
  • npm安装的打印信息没有yarn整洁干净。

pnpm优点

速度快

pnpm的安装速度比yarn/npm快2-3倍,即使yarn有PnP(去掉node_modules,将依赖包内容写在磁盘,节省了node文件I/O的开销),但是pnpm还是更胜一筹。

高效利用磁盘空间

pnpm内部使用基于内容寻址的文件系统来存储磁盘上所有的文件,它的优点在于:

所有文件都会存储在硬盘上的某一位置。 当软件包被被安装时,包里的文件会硬链接到这一位置,而不会占用额外的磁盘空间。 这允许你跨项目地共享同一版本的依赖。

不会重复安装同一个包。用 npm/yarn 的时候,如果 100 个项目都依赖 lodash,那么 lodash 很可能就被安装了 100 次,磁盘中就有 100 个地方写入了这部分代码。但在使用 pnpm 只会安装一次,磁盘中只有一个地方写入,后面再次使用都会直接使用 hardlink硬链接。

即使一个包的不同版本,pnpm也会极大地复用之前版本的代码,比如更新版本之后多了一个文件,pnpm会仅仅写入那一个新增的文件。

支持monorepo

pnpm 与 npm/yarn 另外一个很大的不同就是支持了 monorepo(用一个git仓库来管理多个子项目),体现在各个子命令的功能上,比如在根目录下 pnpm add A -r, 那么所有的 package 中都会被添加 A 这个依赖,当然也支持 --filter字段来对 package 进行过滤。

安全性高

之前在使用 npm/yarn 的时候,由于 node_module 的扁平结构,如果 A 依赖 B, B 依赖 C,那么 A 当中是可以直接使用 C 的,但问题是 A 当中并没有声明 C 这个依赖。因此会出现这种非法访问的情况。但 pnpm 脑洞特别大,自创了一套依赖管理方式,很好地解决了这个问题,保证了安全性,具体怎么体现安全、规避非法访问依赖的风险

依赖管理

yarn/npm install原理

在npm3之前,使用的是依赖嵌套。

node_modules
└─ foo
   ├─ index.js
   ├─ package.json
   └─ node_modules
      └─ bar
         ├─ index.js
         └─ package.json

而npm3之后,使用的是扁平化依赖管理。

node_modules
├─ foo
|  ├─ index.js
|  └─ package.json
└─ bar
   ├─ index.js
   └─ package.json

扁平化管理的缺点:

  • 依赖结构的不确定性
  • 扁平化算法本身的复杂性很高,耗时很长
  • 项目中仍然可以非法访问没有声明过的依赖包

pnpm依赖管理

使用pnpm install之后,在node_modules下

eqDAax

我们直接就看到了我们在package.json中定义的依赖包,但值得注意的是,这里仅仅只是一个软链接,里面并没有node_modules,其实包的依赖包都放到了.pnpm中管理。

3D70Nv

比如axios,需要根据对应的版本号的包下才能找到真正的axios,包的位置的规律都是<package-name>@version/node_modules/<package-name>这种目录结构,这些依赖全部都是软连接

这些包的依赖方式,避免了项目中非法访问没有声明过的依赖包的问题。

上次更新:
贡献者: chenzilin