pnpm是一种新起的包管理器,从npm的下载量看,目前还没有超过yarn,但它的实现方式值得主流包管理器学习,某些开发者极力推荐使用pnpm
从结果上来看,它具有以下优势:
- 目前,安装效率高于npm和yarn的最新版
- 极其简洁的node_modules目录
- 避免了开发时使用间接依赖的问题
- 能极大的降低磁盘空间的占用
安装和使用
全局安装pnpm:npm install -g pnpm
之后在使用时,只需要把npm替换为pnpm即可
如果要执行安装在本地的CLI,可以使用pnpx,它和 npx 的功能完全一样,唯一不同的是,在使用pnpx执行一个需要安装的命令时,会使用pnpm进行安装
比如npx mocha执行本地的mocha命令时,如果mocha没有安装,则npx会自动的、临时的安装mocha,安装好后,自动运行mocha命令
pnpm原理
- 同 yarn 和 npm 一样,pnpm 仍然使用缓存来保存已经安装过的包,以及使用 pnpm-lock.yaml 来记录详细的依赖版本
- 安装的内容在运行命令的工程所在盘的根目录下的.pnpm-store里的registry.npm.taobao.org
- 不同于 yarn 和 npm, pnpm 使用符号链接和硬链接(可将它们想象成快捷方式,类似,但不是。)的做法来放置依赖,从而规避了从缓存中拷贝文件的时间,使得安装和卸载的速度更快【思考:包都在同一目录下,引用都用快捷方式的做法,怎么保证不同项目依赖不同版本包的问题】
- 由于使用了符号链接和硬链接,pnpm可以规避windows操作系统路径过长的问题,因此,它选择使用树形的依赖结果,有着几乎完美的依赖管理。也因为如此,项目中只能使用直接依赖,而不能使用间接依赖(当然,也带来了新的问题,所以暂时npm还没有借鉴过来)
注意事项
由于 pnpm 会改动 node_modules 目录结构,使得每个包只能使用直接依赖,而不能使用间接依赖(就是A依赖只能使用它package里边注册的一级依赖,不能直接引用一级依赖下的依赖。比如A依赖B、B依赖C,pnpm里就不支持A里直接引入C。但是npm或yarn就支持,因为他们把node_modules里的依赖扁平化了。),因此,如果使用 pnpm 安装的包中包含间接依赖,则会出现问题(现在不会了,除非使用了绝对路径)
由于 pnpm 超高的安装卸载效率,越来越多的包开始修正之前的间接依赖代码。
强烈推荐使用!!