什么是pnpm
pnpm 也是一个包管理工具,从功能上来说,与npm 和 yarn是一样的,但是pnpm作为后起之秀,解决了很多 npm 与 yarn中的问题,非常优秀,效率非常的高
pnpm 的安装与基本用法
详细可以参照官网 此处只做最简单的描述
基本使用
# 全局安装
npm i pnpm -g
# 查看版本
pnpm -v
如何使用
基本和npm的用法一致,只是把 npm换成了pnpm
比如
# 安装
pnpm install xxx
# 卸载
pnpm uninstall xxx
pnpm 与 yarn npm 有啥区别
pnpm 效率更高
pnpm 第一次装一个包,可能不算太快,但是一旦安装成功就会计入缓存,最明显的一点就是,删除node_module文件夹非常快,再次安装就直接用缓存了
下面我们以安装Vue为例子
pnpm node_module 非常简洁依赖不打平
在npm或者yarn中,当我们安装一个库,比如 vue这个库,在node_module中把 vue的包和vue所依赖的包给全部平齐的放在node_module中,所以导致node_module中会有很多很多的包
看看npm的表现如何,执行npm i vue
同样情况下,来看看pnpm的表现
执行 pnpm i vue
pnpm中不能使用间接依赖
其实在上面的图中我们已经看到了,就是 npm中的依赖是这样的
我只是得安装了Vue,但是Vue中又依赖了@vue/shared
在npm的安装环境下,会把 Vue的包与@vue/shared的包一同安装在最外层,此时我在代码中 既可以使用 Vue这个库,也可以直接使用@vue/shared这个库(尽管我没有直接安装它)
但是同样的在pnpm中,我的代码中只能使用Vue这个库,而@vue/shared这个库是没有办法使用的
这是两种机制,很显然pnpm更合理,原因主要有两点
- 这样管理依赖更加的显式,也更加的明确,更容易管理。否则你都搞不清,因为我明明没有安装
B这个包,为什么我可以用,可能是你的安装A包中,就依赖了B - 不易出错;比如某一天
A包的作者在某一个小版本迭代中将B包给去除了,而你重新安装了一下A包,以前代码中引用B包是可以运行,现在直接懵逼了,报错了,你就纳闷了,我明明都没有改代码,怎么突然就报错了,有没有感觉很绝望
节约磁盘空间的占用
npm与yarn 使用缓存包的方式
- 当我们在项目A中第一次安装
vue依赖包的时候 - 首先在项目A中下载一份
vue的包 - 在缓存中下载一份
vue的包 - 当在另外一个项目B中也要安装
vue包 - 此时会在缓存中直接通过拷贝的形式把
vue的安装包拷贝到项目B 中 - 那么此时,项目A,项目B,缓存中,都有一份
vue安装包 - 金额承受就是,磁盘会被大量占用,而且拷贝的过程也比较耗费时间
pnpm使用缓存包,运用符号链接和软连接的方式
针对上述的情况,我们看看pnpm是如何做的
- 当我们在项目A中第一次安装
vue依赖包的时候 - 直接在缓存中下载一份
vue - 项目A中的
vue通过一种类似于 *快捷方式的软连接去链接到 缓存中的Vue - 那么再项目B中也安装
vue的话,也是一样的,会直接通过链接的方式来指向缓存中的vue包 - 这样做不需要拷贝包,全部在缓存中,节省了磁盘空间,另外不需要拷贝,也节省的安装包的时候