pnpm为什么如此优秀

2,442 阅读3分钟

什么是pnpm

pnpm 也是一个包管理工具,从功能上来说,与npmyarn是一样的,但是pnpm作为后起之秀,解决了很多 npmyarn中的问题,非常优秀,效率非常的高

pnpm 的安装与基本用法

详细可以参照官网 此处只做最简单的描述

基本使用

# 全局安装
npm i pnpm -g
# 查看版本
pnpm -v

如何使用

基本和npm的用法一致,只是把 npm换成了pnpm 比如

# 安装
pnpm install xxx
# 卸载
pnpm uninstall xxx

pnpm 与 yarn npm 有啥区别

pnpm 效率更高

pnpm 第一次装一个包,可能不算太快,但是一旦安装成功就会计入缓存,最明显的一点就是,删除node_module文件夹非常快,再次安装就直接用缓存了 下面我们以安装Vue为例子

屏幕快照 2024-05-29 下午10.48.49.png

pnpm node_module 非常简洁依赖不打平

npm或者yarn中,当我们安装一个库,比如 vue这个库,在node_module中把 vue的包和vue所依赖的包给全部平齐的放在node_module中,所以导致node_module中会有很多很多的包

看看npm的表现如何,执行npm i vue 屏幕快照 2024-05-29 下午10.04.58.png

同样情况下,来看看pnpm的表现 执行 pnpm i vue 屏幕快照 2024-05-29 下午10.10.20.png

pnpm中不能使用间接依赖

其实在上面的图中我们已经看到了,就是 npm中的依赖是这样的 我只是得安装了Vue,但是Vue中又依赖了@vue/sharednpm的安装环境下,会把 Vue的包与@vue/shared的包一同安装在最外层,此时我在代码中 既可以使用 Vue这个库,也可以直接使用@vue/shared这个库(尽管我没有直接安装它)

屏幕快照 2024-05-29 下午10.37.41.png

但是同样的在pnpm中,我的代码中只能使用Vue这个库,而@vue/shared这个库是没有办法使用的

这是两种机制,很显然pnpm更合理,原因主要有两点

  1. 这样管理依赖更加的显式,也更加的明确,更容易管理。否则你都搞不清,因为我明明没有安装B这个包,为什么我可以用,可能是你的安装A包中,就依赖了B
  2. 不易出错;比如某一天A包的作者在某一个小版本迭代中将B包给去除了,而你重新安装了一下A包,以前代码中引用B包是可以运行,现在直接懵逼了,报错了,你就纳闷了,我明明都没有改代码,怎么突然就报错了,有没有感觉很绝望

屏幕快照 2024-05-29 下午10.37.41.png

节约磁盘空间的占用

npmyarn 使用缓存包的方式

  • 当我们在项目A中第一次安装vue依赖包的时候
  • 首先在项目A中下载一份vue的包
  • 在缓存中下载一份vue的包
  • 当在另外一个项目B中也要安装vue
  • 此时会在缓存中直接通过拷贝的形式把vue的安装包拷贝到项目B 中
  • 那么此时,项目A,项目B,缓存中,都有一份vue安装包
  • 金额承受就是,磁盘会被大量占用,而且拷贝的过程也比较耗费时间

pnpm使用缓存包,运用符号链接和软连接的方式

针对上述的情况,我们看看pnpm是如何做的

  • 当我们在项目A中第一次安装vue依赖包的时候
  • 直接在缓存中下载一份vue
  • 项目A中的vue通过一种类似于 *快捷方式的软连接去链接到 缓存中的Vue
  • 那么再项目B中也安装vue的话,也是一样的,会直接通过链接的方式来指向缓存中的vue
  • 这样做不需要拷贝包,全部在缓存中,节省了磁盘空间,另外不需要拷贝,也节省的安装包的时候