pnpm 使用指南

后端3 min
#Node#pnpm
目录(4)

背景

官网文档给出了 pnpm 的三大优势[1]:

  1. 节省磁盘空间。
  2. 提高安装速度。
  3. 创建一个非扁平的 node_modules 目录

这里不对第三点展开讨论,主要是看中 pnpm 的第一、二点特性。在实际开发中,经常存在多个 Node 项目需要复用依赖的情况,npm 一直没有给出优雅的解决方式。空间的浪费,对于丐版的 MAC 就有些捉襟见肘了。另一痛点是npm 的下载速度感人,经常出去兜个圈,它还在下载中。

pnpm 给出的解决方案是通过软链接与硬链接[2]的方式将不同项目的同个文件串联起来,从而能够提高效率。相较于 yarn 有巨大提升,如果 yarn 对比 npm 是 minor 级别的提升,那 pnpm 的特性,算得上 major 级别的更新了[3]。

安装方式

  1. 安装 pnpm

这里借助了 brew, 官网提供了多样的安装模式。(pnpm 提供了管理 Node 版本的能力,有兴趣的小伙伴,可以不借助 npm,独立安装 pnpm )

brew install pnpm
  1. 设置命令自动补全

若不喜欢 tab 补全可以跳过这一步

指定 shell 安装补全命令,成功后重启 shell

## 输入该命令后选择对应的 shell
pnpm install-completion

## 或者 追加 shell 为参数
pnpm install-completion zsh
  1. 配置 .npmrc 在 MAC OS 下,默认不会采用硬链接的方式进行文件安装[5],所以需要指定安装模式。 在 .npmrc 中,追加配置 package-import-method [6]
## .npmrc
package-import-method=hardlink

FAQ

pnpm 缩减了多少空间?

单一项目: Course (467.7 MB) => Course(400.0 MB)
多项目: Project (12GB) => Project (4.9G) 磁盘可用空间: HD(97.51) => HD(120.34) Tips:(这里测量有误差,因为后续有对磁盘存储优化,可以自己测量一下)

当某个包在项目里取消依赖了,全局的包怎么释放? 这里分为两种情况讨论:

  1. 仅有当前项目引用该包。
  2. 删除本地包pnpm remove
  3. 删除 .pnpm 中的包 pnpm prune
  4. 删除仓库中未引用的包 pnpm store prune [7]。
  5. 有多个项目引用该包。 上述命令不会影响该包,若是手动删除引用,也不会影响到其它项目的引用(硬链接概念)。

相关链接

吐槽一句 , pnpm 的 中文文档很友好,对比 npm 好多了。

引用链接

  1. 项目初衷 | pnpm
  2. Linux 硬链接与软链接
  3. Why should we use pnpm
  4. 安装 | pnpm
  5. Running out of disk space on macos
  6. package-import-method | pnpm
  7. pnpm store | pnpm

好文推荐

pnpm store的文件保存结构 - 掘金 (juejin.cn)

Base64 to Hex | Base64 Decode | Base64 Converter | Base64

新一代包管理工具 pnpm 使用心得 - 知乎 (zhihu.com)

pnpm always links to local /node_modules/.registry.npmjs.org/ folder; ignores store-path config · Issue #794 · pnpm/pnpm (github.com)