【Node.js】npm、yarn 和 pnpm 的区别

1. npm(Node Package Manager)

  • npm是最早出现的JavaScript包管理工具,生态系统非常成熟。使用非常广泛,几乎所有的JavaScript项目都支持npm。
  • 提供了npx命令,可以无需先安装命令即可运行命令(原理是下载代码,运行代码,再将下载后的代码删除),直接进行 nodejs 版本切换,可以直接运行 url(npm仓库 / github gist中的代码)中的代码片段。
  • 使用 package-lock 文件锁版本。
  • npm早期版本(比如v4以前)在性能和安全性上相对较差,安装速度较慢。
  • 依赖管理上曾出现过一些问题,比如“幽灵依赖”(phantom dependency)和难以追踪的依赖版本。

2. yarn

  • yarn 安装速度更快且稳定,特别是在并发下载和缓存上。
  • yarn.lock 确保依赖版本一致性。
  • 提供了一些 npm 没有的特性,比如可以确定所有依赖的状态,通过 yarn audit 提供更好的安全性审查。但有时有些新特性可能会出现某些问题。
npm install -g yarn
  1. 开始新项目 yarn init

  2. 添加依赖包

    yarn add [package]
    yarn add [package]@[version]
    yarn add [package] --dev

  3. 升级依赖包 yarn upgrade [package]@[version]

  4. 移除依赖包 yarn remove [package]

  5. 安装项目的全部依赖 yarn install

3. pnpm

  • pnpm 使用硬链接和符号链接来共享依赖项,从而减少了磁盘空间的使用和安装时间。
  • 安装速度极快,高效的包管理性能使其非常适合大型项目。
  • 支持 monorepo,用于管理多个子包非常方便。
  • 生态相对不成熟,对于老旧的工具兼容性可能会出问题。

在这里插入图片描述

pnpm 安装

pnpm store 位置:pnpm store path

从 store 中删除当前未被引用的包来释放 store 空间。

详细说明

下面图来源:npm, yarn, pnpm 的区别

依赖提升

npm@3 之前是嵌套安装,每一个包都有自己的 node_modules 文件夹:

在这里插入图片描述

这种方式导致会创建较深的依赖树,目录结构很长。

当不同包同时依赖同一个相同的包,那么本地磁盘中会存储多个相同的包。

之后,npm@3 和 yarn 使用了扁平化结构,node_modules 所有包放在同一层级。

但是多个版本的包只有一个能被提升,其他的会被嵌套在各自的依赖中。

在这里插入图片描述

至于那个版本的包被提升,取决于 package.json 中的顺序位置。谁在前,就将谁的依赖包提升。

所以引发的第一个问题是依赖结构的不确定导致扁平化结构的不确定。

锁版本

于是出现了 package-lock.json 和 yarn.lock ,保证 install 后出现确定的依赖结构。但是不能解决仍然出现各种版本的包。

区别:

  1. 这两个文件的内容格式有所差异,package-lock.json 是 JSON 格式的(记录了每一个安装包的确切版本号、依赖树,以及包的来源(npm 仓库、URL 或本地路径)),而 yarn.lock 用的是更紧凑的纯文本格式( key-value 对)。
  2. 生成工具不同:package-lock.json 是由 npm 生成的,而 yarn.lock 是由 Yarn 生成的。
  3. 目的稍有不同:虽然两者都是用来确保项目在不同环境下依赖版本一致,但在 npm 中,package-lock.json 还用来提升安装速度并确保包管理的一致性,Yarn 的锁文件最初是解决 npm 存在的一些性能和一致性问题。

幽灵依赖

第二个问题是存在幽灵依赖,这个包没有在 package.json 中,用户却能引用到这个包:

在这里插入图片描述

当项目不引用 a 和 c ,直接引用 b 也会出现问题。

npm 分身

第三个问题是 npm 分身,提升机制可能会导致大量的依赖被重复安装:

在这里插入图片描述

这里 的 e 和 f 的 1.0 版本被提升,而 2.0 版本被安装多次,造成性能损失。

这时就轮到 pnpm 解决问题了。他会在项目中生成一个 .pnpm 文件,下面的依赖进行平铺,以包名和版本号实现相同版本和不同版本之间的复用和隔离。

由于不存在提升,他没有幽灵依赖的问题。

在这里插入图片描述

为了解决 npm 和 yarn 在不同依赖下多次安装相同的包的问题,也就是 npm 分身的问题,pnpm 使用 名为 .pnpm-store 的存储目录,存储所有包的 hard link 硬链接。如果依赖存在,直接在 .pnpm-store 中 hard link ,不存在则去下载。

由于硬链接只能用于目录,不能用于文件,所以项目还通过 sym link 软链接 链接文件夹 node_modules 。

pnpm 建立硬链接

在这里插入图片描述
在这里插入图片描述

硬链接相当于对内存地址的直接拷贝,一个文件夹改变,拷贝后的文件夹内容同时改变。

软链接(符号链接)相当于建立一个快捷方式,而这个快捷方式直接指向源文件。软链接的手动创建必须拥有管理员权限。

  • 当使用npm或Yrn时,如果你有100个项目,并且所有项目都有一个相同的依赖包,那么,你在硬盘上就需要保存100份该相同依赖包的副本。
  • 如果是使用pnpm,依赖包将被存放在一个统一的位置,因此:
    • 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件
    • 如果你对同一依赖包需要使用不同的版本,则仅有版本之间不同的文件会被存储起来:
    • 所有文件都保存在硬盘上的统一的位置
      • 当安装软件包时,其包含的所有文件都会硬链接到此位置,而不会占用额外的硬盘空间
      • 这让你可以在项目之间方便地共享相同版本的依赖包

pnpm store path 可以获取 pnpm 在本地的总仓库,包含了所有下载过的包。

pnpm 创建非扁平化的 node_modules

在这里插入图片描述

nrm

安装 nrm

在命令行执行命令,npm install -g nrm,全局安装 nrm。

使用 nrm

执行命令 nrm ls 查看可选的源。 其中,带*的是当前使用的源,上面的输出表明当前源是官方源。

切换 nrm

如果要切换到taobao源,执行命令nrm use taobao

也可以使用中国 NPM 镜像:npm install -g cnpm --registry=https://registry.npmmirror.com 来代替 npm。

npm、cnpmyarn、pnpm和nvm都是基于npm的包管理工具,它们都有一些共同的功能,如安装、卸载和更新包。然而,它们也有一些区别和特点。 1. npmNode.js官方的包管理器,是最常用的工具之一。它具有广泛的社区支持和丰富的生态系统。npm的速度和性能已经得到了很大的改进,因此现在与其他工具没有太大的区别。 2. cnpmnpm的一个国内镜像源,提供了更快的下载速度。通过将npm仓库源切换为淘宝镜像,可以使用cnpm来代替npm。使用cnpm安装包的方式与使用npm是一样的。 3.***依赖关系管理。yarn采用了并行和缓存机制来提高性能和可靠性。此外,yarn还引入了锁定文件(yarn.lock),用于确保项目的依赖关系的一致性。 4. pnpm是另一种包管理工具,它与yarn类似,也是为了解决npm的一些问题而创建的。pnpm使用一种称为“硬链接”的技术,将依赖关系存储在一个地方,并在项目之间共享它们,从而减少了磁盘空间和网络带宽的使用。 5. nvm是Node.js版本管理工具,允许您在同一台机器上同时安装和切换不同版本的Node.js。通过nvm,您可以轻松地在不同的项目中使用特定的Node.js版本,以满足项目的要求。 综上所述,npm、cnpmyarn、pnpm和nvm都是用于管理Node.js项目的工具,它们在性能、依赖关系管理和版本控制方面有一些区别。您可以根据具体的项目需求选择使用其中之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值