pnpm 使用指南
# 背景
官网文档给出了 pnpm 的三大优势[1]:
- 节省磁盘空间。
- 提高安装速度。
- 创建一个非扁平的 node_modules 目录
这里不对第三点展开讨论,主要是看中 pnpm 的第一、二点特性。在实际开发中,经常存在多个 Node 项目需要复用依赖的情况,npm 一直没有给出优雅的解决方式。空间的浪费,对于丐版的 MAC 就有些捉襟见肘了。另一痛点是npm 的下载速度感人,经常出去兜个圈,它还在下载中。
pnpm 给出的解决方案是通过软链接与硬链接[2]的方式将不同项目的同个文件串联起来,从而能够提高效率。相较于 yarn 有巨大提升,如果 yarn 对比 npm 是 minor 级别的提升,那 pnpm 的特性,算得上 major 级别的更新了[3]。
# 安装方式
- 安装 pnpm
这里借助了 brew, 官网提供了多样的安装模式。(pnpm 提供了管理 Node 版本的能力,有兴趣的小伙伴,可以不借助 npm,独立安装 pnpm )
brew install pnpm
- 设置命令自动补全
若不喜欢 tab 补全可以跳过这一步
指定 shell 安装补全命令,成功后重启 shell
# 输入该命令后选择对应的 shell
pnpm install-completion
# 或者 追加 shell 为参数
pnpm install-completion zsh
2
3
4
5
- 配置 .npmrc 在 MAC OS 下,默认不会采用硬链接的方式进行文件安装[5],所以需要指定安装模式。 在 .npmrc 中,追加配置 package-import-method [6]
# .npmrc
package-import-method=hardlink
2
# FAQ
# pnpm 缩减了多少空间?
单一项目:
Course (467.7 MB) => Course(400.0 MB)
多项目:
Project (12GB) => Project (4.9G)
磁盘可用空间:
HD(97.51) => HD(120.34) Tips:(这里测量有误差,因为后续有对磁盘存储优化,可以自己测量一下)
当某个包在项目里取消依赖了,全局的包怎么释放? 这里分为两种情况讨论:
- 仅有当前项目引用该包。
- 删除本地包pnpm remove
- 删除 .pnpm 中的包 pnpm prune
- 删除仓库中未引用的包 pnpm store prune [7]。
- 有多个项目引用该包。 上述命令不会影响该包,若是手动删除引用,也不会影响到其它项目的引用(硬链接概念)。
# 相关链接
吐槽一句 , pnpm 的 中文文档很友好,对比 npm 好多了。
# 引用链接
- 项目初衷 | pnpm (opens new window)
- Linux 硬链接与软链接 (opens new window)
- Why should we use pnpm (opens new window)
- 安装 | pnpm (opens new window)
- Running out of disk space on macos (opens new window)
- package-import-method | pnpm (opens new window)
- pnpm store | pnpm (opens new window)
# 好文推荐
pnpm store的文件保存结构 - 掘金 (juejin.cn) (opens new window)
Base64 to Hex | Base64 Decode | Base64 Converter | Base64 (opens new window)