实用pnpm的资料整理
缘起
之前做项目,对于打包工具并没有特别的讲究,也没空认真去研究它们的优劣。
总体上就是yarn用得多点,npm用得少一点,因为React是主力生态的缘故吧,好像还瞄到一篇文章说meta(当年Facebook)团队在研发过程中受不了低效的npm,于是开发了yarn的故事,后来当然就一致以yarn为主了。
后来Expo成熟了,我开发ReactNative的也开始首选Expo,这货的动不动就建议用npx,npx expo install
变成了主要的安装手段,倒也挺方便,此时我也没在意它其实是npm的执行工具。而且这货居然没有提供卸载的命令,于是在卸载包时又顺手yarn remove
。
这样,一个项目时间够久,变得够复杂的时候,往往什么工具都用了,反正电脑上至少有npm和yarn,碰到谁用谁(好多时候直接copy文档的你懂)。
近期看各种视频发现老外特别喜欢用pnpm
,看名字以为它无非是个变种的npm,开始没在意。直到今天想试试3.0后的nextra(之前版本确实稀烂,不摆了),虽然官方文档还是大量用yarn,但github README(上月更新)有这么一句:
The Nextra repository uses [PNPM Workspaces](https://pnpm.io/workspaces) and [Turborepo](https://github.com/vercel/turborepo). To install dependencies, run `pnpm install` in the project root directory.
我觉得确实要了解一下这个pnpm
了。
问AI
pnpm是什么,和yarn比有什么不同和优势?是否现在比较热门?
AI回答
pnpm (performant npm) 是一个现代的包管理器,在2024年确实非常热门。以下是主要特点和与yarn的对比:
主要优势:
- 磁盘空间利用
- pnpm: 使用硬链接和内容寻址存储,所有版本的依赖包只会在硬盘上存储一次
- yarn: 每个项目都会复制依赖包到自己的node_modules
- 安装速度
- pnpm: 通常比yarn和npm快2-3倍
- yarn: 比npm快,但不如pnpm
- 依赖管理:
- pnpm: 使用符号链接创建非扁 平的node_modules结构,更严格的依赖管理
- yarn: 使用扁平化的依赖树,可能导致"幽灵依赖"问题
- 性能对比:
操作 pnpm yarn npm
初次安装 31s 42s 55s
重复安装 3s 7s 12s
磁盘占用 0.8GB 1.3GB 1.3GB
- 特色功能:
- 内置monorepo支持
- 更快的依赖解析
- 更好的安全性
- 支持side-effects标记
- 工作空间协议支持
使用趋势:
2022: 14% 使用率
2023: 28% 使用率
2024: 35%+ 使用率(预计)
基本命令对比:
# 安装依赖
pnpm install
yarn install
# 添加包
pnpm add [包名]
yarn add [包名]
# 删除包
pnpm remove [包名]
yarn remove [包名]
# 运行脚本
pnpm [脚本名]
yarn [脚本名]
选择建议:
- 新项目建议使用pnpm
- 现有项目若无特殊需求可继续使用yarn
- monorepo项目强烈推荐pnpm
- 对磁盘空间要求高的场景选pnpm
总的来说,pnpm正在成为前端工程化的首选包管理器,特别适合现代前端开发需求。
***以上回答,除了说明这个工具性能很高外,重点还省空间(每个项目的node_modules都是黑洞啊)。使用符号链接创建非扁平的node_modules结构真的太重要了,我macbook可怜的512G硬盘...😭。
在中国大陆,pnpm是否也需要镜像包设置?
这个问题很实用,我帮大家问了。
AI回答
是的,在中国使用pnpm也需要设置镜像源以提升下载速度。以下是常用的设置方法:
- 临时使用镜像
pnpm install package-name --registry=https://registry.npmmirror.com
- 永久设置镜像(推荐)
# 设置淘宝镜像
pnpm config set registry https://registry.npmmirror.com
# 查看当前镜像
pnpm config get registry
- .npmrc 文件配置(项目级别)
registry=https://registry.npmmirror.com
常用的国内镜像源:
淘宝:https://registry.npmmirror.com
腾讯:https://mirrors.cloud.tencent.com/npm/
华为:https://mirrors.huaweicloud.com/repository/npm/
- 使用工具切换源
# 安装 nrm
pnpm install -g nrm
# 查看可用源
nrm ls
# 切换到淘宝源
nrm use taobao
# 测试速度
nrm test
- 对于私有包可以设置作用域
@company:registry=http://your-private-registry.com
registry=https://registry.npmmirror.com
注意事项:
- 建议团队统一使用相同的镜像源
- CI/CD环境也需要配置镜像
- 私有包和公共包可以使用不同的源
- 某些包可能需要使用原始npm源
***这其实和其他包管理工具原理一样。
如果我的mac上已经安装了npm, yarn,现在要用pnpm是否需要把这些工具卸载,并清理之前的库、缓存?
明知故问的傻问题,可见我有多迫不及待了😂。
AI回答
不需要卸载npm和yarn,它们可以共存。但建议清理一下缓存以节省空间。以下是具体步骤:
- 安装pnpm
# 使用npm安装
npm install -g pnpm
# 或使用官方推荐的安装脚本
curl -fsSL https://get.pnpm.io/install.sh | sh -
# 验证安装
pnpm --version
- 清理旧缓存(可选)
# 清理npm缓存
npm cache clean --force
# 清理yarn缓存
yarn cache clean
# 清理pnpm缓存
pnpm store prune
- 查看全局包(可选迁移)
# 查看npm全局包
npm list -g --depth=0
# 查看yarn全局包
yarn global list
# 用pnpm重新安装需要的全局包
pnpm add -g package-name
- 常见目录位置
# npm全局包位置
~/node_modules
/usr/local/lib/node_modules
# yarn全局缓存
~/.yarn
# pnpm存储位置
~/.pnpm-store
建议操作:
- 保留npm(因为它是Node.js自带的)
- 按项目使用包管理器:
- 新项目使用pnpm
- 已有项目保持原有的包管理器
- 在package.json中添加限制(可选):
{
"scripts": {
"preinstall": "npx only-allow pnpm"
}
}
不建议的操作:
- 强制卸载npm(可能影响Node.js运行)
- 在同一项目中混用不同的包管理器
- 手动删除node_modules目录(使用清理命令更安全)
省空间啊,强迫症啊😆
如果是一个旧项目,之前用npm和yarn,现在想用pnpm怎么做?
我还想拯救一下之前的...
AI回答
这里删除n个字 大致上就是迁移,很麻烦的,算了。
还是新项目再说,老的不照顾了。
用pnpm是否就没有node-modules目录了?
我知道这又一个傻问题,其实前面都说过。
AI回答
使用 pnpm 时仍然会有 node_modules 目录,但其结构和工作方式与 npm/yarn 有很大不同:
- 结构差异:
- pnpm 创建的 node_modules 是符号链接(symlinks)的集合
- 实际的依赖包存储在全局内容寻址存储中(通常在 ~/.pnpm-store)
- node_modules 中的包是扁平化的,但使用符号链接保持了正确的依赖树结构
- 主要优势:
- 节省磁盘空间:相同的依赖包只会在全局存储中保存一次
- 更快的安装速度:复用已经下载的包
- 避免依赖地狱:严格的依赖树结构
- 实际目录结构示例:
node_modules
├── .pnpm/ (包含实际的依赖包)
├── your-project-deps -> .pnpm/your-project-deps/
└── package -> .pnpm/package@version/node_modules/package
所以总结:pnpm 确实有 node_modules 目录,但它是以符号链接方式组织的,更加高效且节省空间。