pnpm

pnpm

pnpm的官方文档(https://pnpm.js.org/en/)是这样说的: Fast, disk space efficient package manager. pnpm本质上就是一个包管理器,这一点跟npm/yarn没有区别,但它作为杀手锏的两个优势在于:

  • 包安装速度极快;
  • 磁盘空间利用非常高效。

特性

高磁盘利用率

yarn比较熟悉的同学可能会说,yarn不是有PnP安装模式吗?直接去掉node_modules,将依赖包内容写在磁盘,节省了node文件I/O的开销,这样也能提升安装速度。pnpm内部使用基于内容寻址的文件系统来存储磁盘上所有的文件,这个文件系统出色的地方在于:

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

  • 即使一个包的不同版本,pnpm也会极大程度地复用之前版本的代码。举个例子,比如lodash100个文件,更新版本之后多了一个文件,那么磁盘当中并不会重新写入101个文件,而是保留原来的100个文件的hardlink,仅仅写入那一个新增的文件。

支持Monorepo

随着前端工程的日益复杂,越来越多的项目开始使用monorepo。之前对于多个项目的管理,我们一般都是使用多个git仓库,但monorepo的宗旨就是用一个git仓库来管理多个子项目,所有的子项目都存放在根目录的packages目录下,那么一个子项目就代表一个package

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