一、前言
为什么有了npm,还在推Yarn、pnpm这些包管理工具呢?首先来一个横向对比,大家可以看下选哪种管理工具,小编推荐使用🔥pnpm🔥。
二、横向对比
包管理器 | 缺点 | 优点 |
---|---|---|
npm | 1. 安装速度慢,因为是顺序安装 2. package-lock.json有可能不一致 | 1. node默认选择 2. 稳定 |
yarn | 1. 磁盘占用大 | 1. 速度快:利用了缓存和并行安装; 2. 确定性:yarn.lock文件可保证包版本一致 |
pnpm | 1. 兼容性:某些边缘情况需要调整 | 1. 磁盘占用小 2. 速度快:使用硬链接和软链接的方式 3. 解决了幽灵依赖 |
三、pnpm项目的结构
下图是使用pnpm安装bar,bar依赖foo。会发现安装后的node_modules中只有两个文件夹,bar@1.0.0和.pnpm,没有将所有的依赖包扁平化。
四、pnpm的优点是如何实现的
1. 磁盘占用小
项目中node_modules中的依赖,最终都是通过硬链接到.pnpm store
,所以占用的内存很小。查看pnpm依赖包统一保存的位置pnpm sotre path
2. 安装速度快
pnpm 在本地维护了一个缓存,用于存储已安装的依赖项的压缩包。使用pnpm安装依赖时会先去缓存中取,如果有则不需要去远程下载。
3. 解决了幽灵依赖
node_modules中只有package.json中依赖的包,其余依赖包都放在.pnpm中,这样就可以避免幽灵依赖。
幽灵依赖:项目中使用了package.json中没有定义的包,这是比较危险的操作。
硬链接:可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。
软链接:文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。nvm管理node版本就是采用的修改软链接的方式
五、从npm迁移到pnpm
迁移时可能的问题,pnpm i
后启动项目发现还有未安装的包,是项目的不规范引用,导致产生了幽灵依赖,需要手动安装依赖。
- 卸载node_modules,
rm -rf node_modules
- 安装pnpm,
npm install -g pnpm
- 转换package-lock.json或yarn.lock文件为pnpm-lock.yaml,
pnpm import
- 安装依赖,
pnpm install
- 删除package-lock.json或yarn.lock文件(可选操作)