携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
前言
pnpm 相信大家都有了解过,它是一个高性能的包管理器,它通过只保存一个包版本的单个副本从全局 store 硬连接到 node_modules/.pnpm,然后之间通过软链接来组织依赖关系来节省磁盘空间。
是否迁移?
pnpm 性能明显比 npm、yarn,如果使用它的话,那么能够节省出比较可观的磁盘空间。
pnpm 解析依赖的一些问题。
我的磁盘中,有大概 12GB 的项目,包括公司项目、个人项目、平时 github 上面拷贝下来的项目。那如果我需要每个去删除它们的 node_modules 的话,那我可能选择放弃。
但是现在出现了一个工具,可以帮我们列表并且可选择性地删除 node_modules 文件夹,那就是 npkill
。具体它是怎么使用的,请参考它的仓库或者我的上一篇文章:# 我发现了一个 npm 插件,然后腾出了 12 GB的磁盘空间,本文主要写如何正确地迁移这些项目。
npm 和 yarn 和 pnpm 有什么区别?
它们都是包管理器,但是随着一些问题出现,它们的方法和内部功能各不相同。
npm 是在 Nodejs 早期开发的,是 Node.js 的默认包管理器,它以不确定的方式安装依赖,也就有可能安装的时候无法保持一致性。另一个就是安装速度慢。
yarn 的出现就是为了解决 npm 存在的问题,也就是安装的依赖的一致性,有效地利用系统资源,同步执行所有任务,提高了性能。
pnpm 的出现主要是为了性能,通过只保存一个包版本的单个副本并使用硬链接在项目用引用依赖来节省磁盘空间。
性能对比
action | cache | lockfile | node_modules | npm | pnpm | Yarn | Yarn PnP |
---|---|---|---|---|---|---|---|
install | 36.7s | 15.9s | 16.7s | 22.9s | |||
install | ✔ | ✔ | ✔ | 2s | 1.3s | 2.1s | n/a |
install | ✔ | ✔ | 10.8s | 4.6s | 6.5s | 1.4s | |
install | ✔ | 15.4s | 7.6s | 11.1s | 6.1s | ||
install | ✔ | 17.6s | 13.7s | 11.5s | 17.2s | ||
install | ✔ | ✔ | 2.6s | 2.8s | 6.9s | n/a | |
install | ✔ | ✔ | 2s | 1.3s | 7.1s | n/a | |
install | ✔ | 2.6s | 7.8s | 11.7s | n/a | ||
update | n/a | n/a | n/a | 2s | 9.8s | 15.4s | 28.3s |
如何迁移?
使用 npm 或 yarn 安装依赖项时,所有包都被提升到模块目录的根目录。因此,源代码可以访问未作为依赖项添加到项目的依赖项。
默认情况下,pnpm 使用符号链接仅将项目的直接依赖项添加到模块目录的根目录中。
以上是 pnpm 官网的两句话。
意味着如果 package.json 没有引用的依赖,那么它将无法解析。这是迁移中的最大障碍。可以使用 auto-install-peers 设置自动执行此操作(默认情况下是false)
如何迁移?
- 项目根目录创建一个 .npmrc,主要为了解决上面的 package.json 没有引用的依赖无法解析的问题
auto-install-peers=true
pnpm import
pnpm-lock.yaml
从另一个包管理器的锁文件生成一个。支持的源文件:
package-lock.json
npm-shrinkwrap.json
yarn.lock
- 运行
pnpm i
将依赖项安装到新的 node_modules文件夹中。
结论
我的个人项目暂时没有发现迁移过程出现问题,我会继续尝试迁移旧一点的项目或者大项目,看看是否带来其他问题。
毕竟多尝试一下未必是坏事,最坏的结果也能清理出来一些磁盘空间。