在现代前端开发中,使用高效的包管理器可以显著提升开发体验和性能。pNpm 是一个快速、节省磁盘空间的包管理器,它通过去重依赖和模块隔离实现更高效的依赖管理。本文将介绍如何将一个已有项目迁移到 pNpm。
因为 pNpm 真的帮助到我节省了硬盘空间,我现在主力电脑是一台512GB的MacBook Pro,买 512GB 是因为上一台电脑就是这么大的存储,它确实够用了,但现在存储容量已经连 xcode 都更新不了了,经过排查,发现我的项目文件已经高达120GB,删除了许多冷藏了的项目依旧还有 80GB,虽然已经删除了 mac 系统的 4K 动态视频壁纸,但电脑容量依旧告急。
下面分享下我是如何使用 pNpm 来解放电脑存储的。
为什么选择 pNpm
pNpm有以下几个显著优点:
- 磁盘空间节省:使用硬链接机制,所有项目共享相同的依赖文件,避免重复占用磁盘空间。
- 更快的安装速度:安装依赖速度更快,尤其是重复依赖的项目。
- 模块隔离:通过严格的依赖隔离,避免潜在的版本冲突问题。
- 兼容性好:与
npm和yarn完全兼容。
安装pNpm
安装 pNpm 有多种方法,具体参考安装文档,我推荐使用 brew>shell脚本>npm的方式安装。选择其中一种方式即可。
开始更换pNpm
第一部先检查项目是否运行正常,打包、编译、单元测试、构建是否都正常,了解到项目情况再开始进行更换。
第一步:删除node_modules文件夹
rm -rf node_modules
第二步:新建.npmrc
pNpm 不会使用 nrm 的配置,如果在公司项目中,则需要单独配置仓库地址。 建议私人项目也配置一个.npmrc,pnpm将会从项目的.npmrc中获取配置,如果项目根目录不存在,则会从用户主目录下的.npmrc中获取,否则使用默认配置
# pNpm 配置
# https://pnpm.io/zh/npmrc#shamefully-hoist
# registry=https://mirrors.tencent.com/npm/
# @company#ui:registry=https://example.com/packages/npm/
# example.com/:_authToken=${NPM_TOKEN}
shamefully-hoist=true
auto-install-peers=true
strict-peer-dependencies=false
第三步:生成pnpm-lock.json
pnpm import
第四步:使用 pnpm-lock.json安装依赖
pnpm i
到这一步,再次检查项目运行情况、确保更换 pnpm 管理依赖后,项目运行与更换之前一致。
最后一步:最后清理现有的锁定文件(package-lock.json 或 yarn.lock):
到这里,这个更换过程完成、后续在项目中安装/移除依赖、运行项目、运行单元测试都用pnpm命令替换掉npm即可。
常用 pNpm 命令
安装依赖
pnpm add <package_name>
示例:安装 lodash:
pnpm add lodash
删除依赖
pnpm remove <package_name>
安装开发依赖
# 保存到 `devDependencies`
pnpm add <package_name> --save-dev
# 简写
pnpm add -D sax
# 保存到 `dependencies`
pnpm add sax
# 保存到 `optionalDependencies`
pnpm add -O sax`
# Install package globally
pnpm add -g sax
# 从 `next` 标签下安装
pnpm add sax@next
# 安装指定版本 `3.0.0`
pnpm add sax@3.0.0
更新依赖
pnpm update <package_name>
列出依赖
pnpm list
常见问题及解决方案
问题 1: 一些工具无法解析依赖
解决方案:启用 shamefully-hoist,提升依赖到顶层:
pnpm config set shamefully-hoist true
问题 2: 依赖版本冲突
解决方案:检查 pnpm-lock.yaml 中冲突的依赖版本,或者使用以下命令强制解决:
pnpm dedupe
问题 3: pnpm import转换 package-lock.json为pnpm-lock.json时报错WARN GET https://r.cnpmjs.org/@vitest%2Feslint-plugin error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.
原因:pNpm 版本和node 版本不匹配,node 20 下 pnpm 8 网络连接失败,更新 pnpm 9 即可,但使用 npm install -g pnpm@latest始终安装的是8
解决方案:将 npm 安装的 pnpm 卸载、使用 brew/shell脚本/npm install -g @pnpm/exe安装pnpm
pnpm dedupe
注意
- 在项目中
pNpm可以完全替代npm,但npm可以使用nrm的配置,pNpm则暂时不可以使用nrm的配置,但pNpm支持npm的.npmrc。 pNpm依赖npm的版本,具体规则请参考兼容性- 这里不涉及
pNpm的工作空间,具体文档参考工作空间
总结
迁移到pNpm后,你的项目将拥有更高效的依赖管理机制、更少的磁盘占用和更快的构建速度。通过本文的步骤,你可以轻松完成迁移,并享受 PNPM 带来的性能提升。
希望对磁盘告急的你有帮助。