pnpm,npm 与 yarn 后出现新一代好用的管理器

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pnpm,npm 与 yarn 后出现新一代好用的管理器相关的知识,希望对你有一定的参考价值。

pnpm,npm 与 yarn 后出现新一代好用的管理器

最近在网上搜东西,然后被推荐了一个新的 node module 管理器——pnpm,下载体验一下之后,发现确实比起 npm/yarn 来说有一些独特的优点。

目前的 pnpm 的下载量不算少,光是 npm 上的下载就超过了 80w/周,更别说在 npm 之外的下载了——官方文档上说:

On POSIX systems, you may install pnpm even if you don’t have Node.js installed, using the following script:

…省略下载方式若干

随后使用 pnpm 去下载 node

这也就意味着可以直接通过 pnpm 可以取代 nvm,进行对 node 版本的管理——nvm 在 Windows 上和 _NIX 上是两个不同的包,直接使用 pnpm 也可以直接对环境进行统一。

另外看来,pnpm 目前的发展前途还是不错的,资助该项目的组织有:

使用 pnpm 的组织有:

这种也可以算是有大厂背书了,如果出现了漏洞,那么它的 patches 应该也会挺快的。

这里安装就直接使用 npm install -g pnpm 了,不过还是需要检查一下 npm 的版本:

ERROR: This version of pnpm requires at least Node.js v14.19
The current version of Node.js is v14.18.2
Visit https://r.pnpm.io/comp to see the list of past pnpm versions with respective Node.js version support.

我遇上了这个问题,所以就下了一个 node v16 继续……

支持的版本在这里:

目前来说使用较新版本的 v14 和 v16 问题都不大。

简单的对比

pnpm 说它比 npm 快,省空间,那么现在就用一个简单的案例来做一下对比,这里新建一个文件夹,分别使用 npm 和 pnpm 去构建一个新的 Next 项目。

操作pnpmnpm
新建 next 项目直接安装还需要安装 create-next-app
node_modules 大小100mb
129mb
node_modules 结构

… 后面我就不继续放了……太多了

下载速度 pnpm 似乎也占优:

这里只针对 clean install 的情况,不过这个 benchmark 是 pnpm 提供的,会不会注水无法确认。不过对于 clean install 来说,pnpm 的 node_modules 本身就比 npm 的小,正常来说下载速度就应该会快很多。

pnpm 的一些优势

  • 放弃扁平化结构后更加安全。

    这是我之前在某篇文章中看到的,npm 存在的一个安全隐患在于,如果 package A 没有安装某个包,但是 package B 安装了,那么 A 中的代码其实可以直接访问 B 安装的依赖包。

  • 使用提升的 global store

    npm 使用扁平的结构会造成另外一个问题,那就是当两个包都对第三方包存在依赖——如 Next 需要 react 和 react-dom(假设 v17),react 自身也会安装 react-dom(假设 v18),这时候 node_module 就会 cv 两个版本的 react-dom——即 react-dom 被安装了两次。

    而在 I/O 的读写时最耗时的。

    pnpm 会使用 link 去关联包,如果存在上面列举的情况,pnpm 会使用 symlink 去解决这个问题,具体的细节部分官方文档这里有解释:Symlinked node_modules structure

    以上面 next 和 react-dom 的例子来说,那就是 react-dom 会有自己单独的一个文件夹,如高亮所示:

    pnpm 会使用一个叫 symlink 的技术去对关联对应的依赖包,这样的结果就是 next 安装了 react 和 react-dom,在 react 安装相关依赖包的时候,它不会再安装一次 react-dom,而是会找到对应的依赖进行关联。

pnpm 的局限

  • npm-shrinkwrap.json and package-lock.json 两个文件不会被 pnpm 所读取

    没有 lock 的版本可能会存在版本问题

  • node_modules/.bin 下文件都是 shell 脚本文件,而不存在关联的 js 文件

    目前好像没有在 .bin 下面用过脚本文件,但是有这个业务需求的就一定要注意这个问题

以上是关于pnpm,npm 与 yarn 后出现新一代好用的管理器的主要内容,如果未能解决你的问题,请参考以下文章

npm,yarn和pnpm

pnpm

果断放弃npm切换到pnpm--节约磁盘空间(256G硬盘救星)

果断放弃npm切换到pnpm--节约磁盘空间(256G硬盘救星)

vite实战

为什么我们从Yarn切换到pnpm