pnpm 是什么?和 npm 什么关系?
现代前端开发中离不开 npm, npm 是 Node Package Manager 的缩写,顾名思义就是 Node 包管理器,我们使用它发布、安装和卸载 NodeJS 包。
那最近很火的 pnpm 是啥呢?跟 npm 有什么关系?
首先解读一下他的名字,根据官方介绍,p
就是 performance(性能卓越的、高性能的) 的意思,npm
就是我们刚才提到的 npm。pnpm 就等于 Performance Node Package Manager。是的,就是这么豪横。他能完全代替 npm,并且安装速度更快、占用磁盘更小。
根据测试数据,pnpm 比 npm 和 yarn 快 2 倍。
站在 yarn 的肩膀上
yarn 是 facebook 联合有其他一些公司在 npm v3 版本时推出的一个新的开源的包管理器,它的出现是为了弥补 npm 当时安装速度慢、依赖包版本不一致等问题。
yarn 跟当时的 npm 相比有以下优点:
-
安装速度快
npm 是按照队列依次安装每个 package,当前一个 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务。而且,如果一个 package 之前已经安装过,yarn 会直接从缓存中获取,而不是重新下载。
-
统一包版本
yarn 还创新性的新增了
yarn.lock
文件,它是 yarn 在安装依赖包时,自动生成的一个文件,作用是记录 yarn 安装的每个 package 的版本,保证之后 install 时的版本一致。不过随着后来 npm 也新增了作用相同的 package-lock.json,这个优势已经不太明显。
-
节省磁盘空间
我们知道,包的安装方法是从服务器上下载到本地,写入到 node_modules 文件夹,而每个包又有自己的 依赖,也会有 node_modules 文件夹,所以当一个 package 在不同的依赖项中需要时,它会被多次复制粘贴并生成多份文件,形成一个很深的依赖树。
而 yarn 会将相同的依赖提升到最顶层,而不是每个包下都存在一个相同的副本。
但是 yarn 足够完美了吗?它虽然解决了很多问题,但还远远不够,此时 yarn 和 npm 还存在两个明显的问题:
如果一个包卸载,那么他相关的依赖也会被卸载(没有在项目中 package.json 中声明的),这就有可能卸载项目中还在使用过的包。
当一个包有多个版本的时候,只会提升一个,其余版本的包还会存在重复安装的情况。
更快、更轻
2017 年 pnpm 正式发布,不过直到最近两年他才大火。 相比较于 yarn,pnpm 在性能上又有了极大的提升。它解决了 npm、yarn 重复文件过多、复用率低等问题。
pnpm 内部使用基于内容寻址的文件系统来存储磁盘上所有的文件,这个文件系统出色的地方在于:
同一个包只会安装一次,磁盘中只有一个地方写入,后面再次使用都会直接使 hardlink。即使一个包的不同版本,pnpm 也会极大程度地复用之前版本的代码。举个例子,比如 lodash 有 100 个文件,更新版本之后多了一个文件,那么磁盘当中并不会重新写入 101 个文件,而是保留原来的 100 个文件的 hardlink,仅仅写入那一个新增的文件。
如何使用 pnpm
pnpm 的命令和 npm、yarn 基本类似,下面我列举一个常用的和 npm、yarn 等价的命令,供大家参考,其中 [package]
代表包名:
- | npm | yarn | pnpm |
---|---|---|---|
Install all | npm install | yarn | pnpm install |
Install | npm install [package] | yarn add [package] | pnpm add [package] |
npm install [package] -D | yarn add [package] -D | pnpm add -D [package] | |
npm install [package] -g | yarn global add [package] | pnpm add -g [package] | |
Uninstall | npm uninstall [package] | yarn remove [package] | pnpm remove [package] |
Update | npm update [package] | yarn upgrade [package] | pnpm update [package] |
更多命令可以点击官网的命令列表查看。
参考资料: