pnpm 是什么
和npm
,yarn
一样,pnpm
是一个包管理工具。不一样的是,pnpm
解决了npm
和yarn
一直都没有解决的痛点。在许多方面比npm
和yarn
更优秀。
pnpm对比npm/yarn的优点
- 更快速的依赖下载
- 更高效的利用磁盘空间
- 更优秀的依赖管理
更快速的依赖下载
根据官方提供的数据↓
从图上我们可以看出,pnpm
平均比npm
和yarn
快上2~3倍。这一点在依赖的下载上额外明显。
更高效的利用磁盘空间
为什么说pnpm
会比npm
和yarn
更高效的利用磁盘空间?
pnpm
有一个store
的概念(是一块存储文件的空间,后面会说到),内部使用"基于内容寻址"的文件系统来存储磁盘上所有的文件,这一套系统的优点是:
不会重复下载依赖
举个例子 假设出现这么一个情况↓
你4个项目都依赖了express.js(第三方插件)。如果是npm/yarn的话,express.js就会被安装4个在你的磁盘空间当中。从而出现下面这个情况↓
但是pnpm
得益于"基于内容寻址"的文件系统,使用pnpm下载的文件不论被多少项目所依赖,都只会在磁盘中写入一次。后面再有项目使用的时候会采用硬链接的方式去索引那一块磁盘空间。
所以,在同样被多个项目依赖的时候,pnpm对磁盘的占用如下↓
更好玩的是
如果有一天你所依赖的版本提升了。假设从express@2.0
升级到了express@3.0
。而express@3.0
比express@2.0
多了20个文件。这个时候pnpm
并不会删除express@2.0
再去重新下载express@3.0
。而是复用express@2.0
原本的磁盘内容。再在express@2.0
的基础上增加20个文件形成express@3.0
。
更优秀的依赖管理
在npm1和npm2的时候。依赖结构是这样的↓
代码示例(一)
node_modules
└─ 依赖A ├─ index.js ├─ package.json └─ node_modules └─ 依赖B ├─ index.js └─ package.json
└─ 依赖C ├─ index.js ├─ package.json └─ node_modules └─ 依赖B ├─ index.js └─ package.json
上面这种结构会导致哪些问题呢