拥抱pNpm,解放磁盘空间

529 阅读4分钟

在现代前端开发中,使用高效的包管理器可以显著提升开发体验和性能。pNpm 是一个快速、节省磁盘空间的包管理器,它通过去重依赖和模块隔离实现更高效的依赖管理。本文将介绍如何将一个已有项目迁移到 pNpm。

因为 pNpm 真的帮助到我节省了硬盘空间,我现在主力电脑是一台512GB的MacBook Pro,买 512GB 是因为上一台电脑就是这么大的存储,它确实够用了,但现在存储容量已经连 xcode 都更新不了了,经过排查,发现我的项目文件已经高达120GB,删除了许多冷藏了的项目依旧还有 80GB,虽然已经删除了 mac 系统的 4K 动态视频壁纸,但电脑容量依旧告急。

下面分享下我是如何使用 pNpm 来解放电脑存储的。

为什么选择 pNpm

pNpm有以下几个显著优点:

  • 磁盘空间节省:使用硬链接机制,所有项目共享相同的依赖文件,避免重复占用磁盘空间。
  • 更快的安装速度:安装依赖速度更快,尤其是重复依赖的项目。
  • 模块隔离:通过严格的依赖隔离,避免潜在的版本冲突问题。
  • 兼容性好:与 npmyarn 完全兼容。

安装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.jsonyarn.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.jsonpnpm-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 带来的性能提升。

希望对磁盘告急的你有帮助。