还在用npm吗,快来试试🔥pnpm🔥吧

77 阅读2分钟

一、前言

为什么有了npm,还在推Yarn、pnpm这些包管理工具呢?首先来一个横向对比,大家可以看下选哪种管理工具,小编推荐使用🔥pnpm🔥。

二、横向对比

包管理器缺点优点
npm1. 安装速度慢,因为是顺序安装
2. package-lock.json有可能不一致
1. node默认选择
2. 稳定
yarn1. 磁盘占用大1. 速度快:利用了缓存和并行安装;
2. 确定性:yarn.lock文件可保证包版本一致
pnpm1. 兼容性:某些边缘情况需要调整1. 磁盘占用小
2. 速度快:使用硬链接和软链接的方式
3. 解决了幽灵依赖

三、pnpm项目的结构

下图是使用pnpm安装bar,bar依赖foo。会发现安装后的node_modules中只有两个文件夹,bar@1.0.0和.pnpm,没有将所有的依赖包扁平化。 dd13ec60bae9477ba03998545f811667~tplv-k3u1fbpfcp-zoom-in-crop-mark-1512-0-0-0.awebp.webp

四、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后启动项目发现还有未安装的包,是项目的不规范引用,导致产生了幽灵依赖,需要手动安装依赖。

  1. 卸载node_modules,rm -rf node_modules
  2. 安装pnpm,npm install -g pnpm
  3. 转换package-lock.json或yarn.lock文件为pnpm-lock.yaml,pnpm import
  4. 安装依赖,pnpm install
  5. 删除package-lock.json或yarn.lock文件(可选操作)

六、参考链接

  1. yarn、npm、pnpm的比较
  2. 浅谈pnpm的软链接和硬链接
  3. pnpm官方网站