pnpm 是什么?它和 npm、 yarn 有什么区别?

pnpm.png

pnpm 是什么?和 npm 什么关系?

现代前端开发中离不开 npm, npm 是 Node Package Manager 的缩写,顾名思义就是 Node 包管理器,我们使用它发布、安装和卸载 NodeJS 包。

那最近很火的 pnpm 是啥呢?跟 npm 有什么关系?

首先解读一下他的名字,根据官方介绍,p 就是 performance(性能卓越的、高性能的) 的意思,npm 就是我们刚才提到的 npm。pnpm 就等于 Performance Node Package Manager。是的,就是这么豪横。他能完全代替 npm,并且安装速度更快、占用磁盘更小。

根据测试数据,pnpm 比 npm 和 yarn 快 2 倍。

站在 yarn 的肩膀上

yarn 是 facebook 联合有其他一些公司在 npm v3 版本时推出的一个新的开源的包管理器,它的出现是为了弥补 npm 当时安装速度慢、依赖包版本不一致等问题。

yarn 跟当时的 npm 相比有以下优点:

  • 安装速度快
    npm 是按照队列依次安装每个 package,当前一个 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务。

    而且,如果一个 package 之前已经安装过,yarn 会直接从缓存中获取,而不是重新下载。

  • 统一包版本

    yarn 还创新性的新增了 yarn.lock 文件,它是 yarn 在安装依赖包时,自动生成的一个文件,作用是记录 yarn 安装的每个 package 的版本,保证之后 install 时的版本一致。

    不过随着后来 npm 也新增了作用相同的 package-lock.json,这个优势已经不太明显。

  • 节省磁盘空间

    我们知道,包的安装方法是从服务器上下载到本地,写入到 node_modules 文件夹,而每个包又有自己的 依赖,也会有 node_modules 文件夹,所以当一个 package 在不同的依赖项中需要时,它会被多次复制粘贴并生成多份文件,形成一个很深的依赖树。

    而 yarn 会将相同的依赖提升到最顶层,而不是每个包下都存在一个相同的副本。

但是 yarn 足够完美了吗?它虽然解决了很多问题,但还远远不够,此时 yarn 和 npm 还存在两个明显的问题:

  1. 如果一个包卸载,那么他相关的依赖也会被卸载(没有在项目中 package.json 中声明的),这就有可能卸载项目中还在使用过的包。

  2. 当一个包有多个版本的时候,只会提升一个,其余版本的包还会存在重复安装的情况。

更快、更轻

2017 年 pnpm 正式发布,不过直到最近两年他才大火。 相比较于 yarn,pnpm 在性能上又有了极大的提升。它解决了 npm、yarn 重复文件过多、复用率低等问题。

pnpm 内部使用基于内容寻址的文件系统来存储磁盘上所有的文件,这个文件系统出色的地方在于:

同一个包只会安装一次,磁盘中只有一个地方写入,后面再次使用都会直接使 hardlink。即使一个包的不同版本,pnpm 也会极大程度地复用之前版本的代码。举个例子,比如 lodash 有 100 个文件,更新版本之后多了一个文件,那么磁盘当中并不会重新写入 101 个文件,而是保留原来的 100 个文件的 hardlink,仅仅写入那一个新增的文件。

如何使用 pnpm

pnpm 的命令和 npm、yarn 基本类似,下面我列举一个常用的和 npm、yarn 等价的命令,供大家参考,其中 [package] 代表包名:

- npm yarn pnpm
Install all npm install yarn pnpm install
Install npm install [package] yarn add [package] pnpm add [package]
npm install [package] -D yarn add [package] -D pnpm add -D [package]
npm install [package] -g yarn global add [package] pnpm add -g [package]
Uninstall npm uninstall [package] yarn remove [package] pnpm remove [package]
Update npm update [package] yarn upgrade [package] pnpm update [package]

更多命令可以点击官网的命令列表查看。


参考资料:

  • pnpm - npm

  • pnpm add | pnpm

  • npm 和 yarn 的区别,我们该如何选择? - 掘金

  • 关于现代包管理器的深度思考——为什么现在我更推荐 pnpm 而不是 npm/yarn? - 掘金

你可能感兴趣的:(pnpm 是什么?它和 npm、 yarn 有什么区别?)