详解yarn 、npm 、 npx 、 cnpm 、 pnpm等包管理工具及其差异

详解yarn 、npm 、cnpm 、pnpm等包管理工具

yarn 、npm 、 npx 、 cnpm 、 pnpm等包管理工具主要用于帮助开发者高效地管理项目中的各种依赖库、框架、工具以及其他代码模块。这些工具通过自动化的方式处理依赖的下载、安装、更新和卸载,确保项目中使用的每个外部组件都处于正确的版本,并且能够协同工作,避免版本冲突。

一、npm

npm(Node Package Manager)是Node.js的默认包管理器,也是全球最大的软件注册表之一,专注于JavaScript生态系统。它允许开发者轻松地发现、共享、重用以及管理依赖关系。npm不仅用于管理Node.js的模块,也广泛应用于前端开发,支持安装和管理如React、Vue等前端框架和库。

1、安装

npm 是 nodejs 中的一部分,通常与 nodejs 一起安装和更新。只需访问Node.js官方网站下载并安装Node.js即可,安装完成后,通过命令行输入npm -v可以验证npm是否安装成功及其版本。

在工作中,不同的项目依赖不同版本的NodeJS运行环境,这种情况下,对于维护多个版本的node将会是一件非常麻烦的事情,nvm(Node Version Manager)就是为解决这个问题而产生的,他可以方便的在同一台设备上进行多个node版本之间切换。

2、常见配置

npm安装包的项目中,会生成两个文件,package.jsonpackage-lock.json,其中package.json负责管理项目的依赖关系,package-lock.json文件负责版本锁定,确保依赖的可复现性。

在package.json文件中,常见属性如下:

  • name:项目的名称;
  • version:当前项目的版本号;
  • description:描述信息,很多时候是作为项目的基本描述;
  • author:作者相关信息(发布时用到);
  • license:开源协议(发布时用到);
  • main:设置程序的入口;
  • dependencies:无论开发环境还是生成环境都需要依赖的包;
  • devDependencies:开发环境需要依赖的包;
  • scripts:配置一些脚本命令,例如npm run dev等命令;

3、npx

npx 是随 npm(Node Package Manager)5.2.0 及更高版本一同提供的一个命令行工具。它的设计初衷是为了简化执行 Node.js 包中包含的可执行文件的过程,特别是对于那些只需要临时使用或希望避免全局安装的包而言。npx 提供了一种更加灵活和便捷的方式来运行命令行应用程序,尤其是在处理项目特定或版本特定的工具时。

特点

  1. 一次性执行:npx 允许用户直接运行一个包中的命令,而无需事先全局安装该包。如果包未在本地安装,npx 会临时下载并执行它,执行完毕后不会在系统中留下痕迹。
  2. 临时安装:当请求的包不在本地时,npx 会自动从 npm 仓库下载并安装到一个临时位置,然后执行。并且安装后,并不会在全家安装。
  3. 版本管理:npx 能够基于项目中的 package.jsonnode_modules 自动选择正确的包版本,这有助于在多项目环境中管理不同版本的依赖。每个项目可以独立使用其所需版本的工具,减少了版本冲突的风险。
  4. 路径自动处理:npx 会自动查找 node_modules/.bin 目录下的可执行文件,无需手动指定路径。

4、npm install的原理

在这里插入图片描述
该图片引自耀南

  1. 读取配置与依赖: npm install 首先会读取项目根目录下的package.json文件,以获取项目依赖信息。这个文件中列出了项目直接依赖的包及其版本范围,以及可选的开发依赖 (devDependencies) 和其他元数据。
  2. 解析依赖关系: npm 使用一个算法来解析这些依赖项,生成一个依赖树。这个过程中,npm 会递归地解析每个依赖包的依赖,直到没有新的依赖需要安装。在此期间,npm 会解决版本兼容性问题,确保所有依赖的版本符合语义化版本控制(Semantic Versioning, SemVer)规则。
  3. 检查 package-lock.json 或 npm-shrinkwrap.json: 如果存在package-lock.jsonnpm-shrinkwrap.json文件,npm 会优先使用这些文件中锁定的依赖版本信息,以确保安装过程中的版本一致性。这有助于复现构建环境,避免因依赖包版本变动导致的问题。
  4. 下载与安装: 接下来,npm 根据解析出的依赖关系,从 npm Registry 下载所需的包。它会尽可能利用本地缓存来加速下载过程,避免重复下载。下载的包会被解压到项目的node_modules目录下,并按照依赖树的结构组织。
  5. 生成或更新 lock 文件: 如果之前没有 lock 文件,npm 会生成一个新的package-lock.json文件,记录安装时确切使用的每个包及其依赖的版本号。如果已经存在 lock 文件,npm 则会根据本次安装的情况更新 lock 文件,确保其与实际安装的依赖相匹配。
  6. 链接: 对于具有可执行脚本的包,npm 会创建符号链接或复制到全局的可执行路径,以便可以直接从命令行调用。

二、yarn

yarn是一个快速、可靠、且安全的依赖管理工具,旨在改进 npm 的体验。Yarn 为 JavaScript 项目提供了一个强大的解决方案,用于解决依赖管理中的常见问题,如安装速度慢、依赖不一致性和安全性。Yarn 支持离线模式、锁定文件、并行安装、缓存机制等功能,提高了开发效率和项目维护的便捷性。

1、安装

Yarn 可以通过多种方式安装,以下是几种常见的安装方法:

扫描二维码关注公众号,回复: 17523270 查看本文章
  • npm 安装(适用于已安装 Node.js 的环境):
npm install -g yarn
  • 直接下载安装脚本:从 Yarn 官网获取安装脚本,适用于多种操作系统。

2、yarn与npm的区别

  • 安装速度与性能:Yarn的安装速度通常比npm快。
    • Yarn在安装包时会先从本地缓存中寻找,如果本地没有找到,才会去下载,而npm则是直接从远程源下载。
    • Yarn在性能上优于npm。Yarn使用并行安装,可以加快安装速度;而npm则是串行安装,速度较慢。
  • 安装版本:Yarn和npm在安装版本上有所不同。Yarn安装的包版本可以在yarn.lock文件中明确指定,这保证了在不同的开发环境中使用相同的版本。而npm则倾向于安装最新的版本。
  • 包的管理:Yarn和npm在管理包的方式上存在差异。Yarn使用yarn.lock文件管理包的版本,这保证了在不同的开发环境中使用相同的版本;而npm则依赖于package-lock.json文件来锁定依赖项版本。
  • 依赖管理:Yarn在管理包依赖关系时比npm更严格。Yarn可以管理多个包之间的依赖关系,而npm则不能。

3、特点

Yarn除了以上的区别外,还有很多其他的特点:

离线安装模式:因为Yarn 会缓存已下载的依赖包,使得在无网络连接或网络不稳定的情况下,仍能快速安装依赖。

智能决议算法:在使用npm安装时,常出现依赖冲突的问题,但是Yarn 采用一个复杂的算法来解决依赖冲突,确保依赖树的高效和一致性。

4、缺陷

尽管Yarn在很多方面对npm进行了改进和优化,提供更快的安装速度、更好的依赖管理以及增强的用户体验,但它并非完美无缺,也存在一些潜在的缺陷或局限性:

  1. 兼容性问题:由于Yarn的设计理念和实现方式与npm有所不同,某些特定的npm插件或者工作流可能与Yarn不完全兼容,尤其是在处理一些较为复杂或者非标准的依赖情况时。
  2. 生态系统差异:虽然Yarn的用户群体庞大,但相比npm作为Node.js的默认包管理器,npm的生态系统更为成熟和广泛,这意味着npm可能拥有更多针对特定需求的工具、教程和支持。
  3. 更新滞后:对于一些最新的npm包发布,Yarn的注册表更新可能会有轻微的延迟,虽然这种情况并不常见,但在追求最新包版本的场景下可能会成为一个考虑因素。
  4. 安装和配置问题:在某些特殊环境或受限的系统中,Yarn的安装和配置可能不如npm灵活或直接,特别是当依赖管理系统或网络策略限制了第三方软件安装时。

因此,尽管Yarn在很多场景下表现优秀,但在选择时也需要权衡它与npm的差异,考虑项目的具体需求、团队的熟悉程度以及长期维护的便利性。

三、cnpm

cnpm 是 “China Node Package Manager” 的缩写,是一个完全兼容 npm 的命令行工具,为中国大陆地区的开发者提供了一些额外的功能。

由于网络原因,中国大陆地区的开发者在直接使用 npm 安装包时可能会遇到速度慢甚至无法安装的问题。为了解决这个问题,淘宝团队创建了一个 npm 的镜像源 - 淘宝 NPM 镜像,而 cnpm 就是这个镜像源的命令行工具。

1、安装

在已经安装Node.js和npm的基础上,可以通过以下命令安装cnpm:

npm install -g cnpm --registry=https://registry.npm.taobao.org

这行命令会全局安装cnpm,并将其下载源设置为淘宝的npm镜像。安装cnpm后,使用cnpm config get registry检查下载源是否已正确设置为淘宝镜像。

2、特点

  1. 镜像同步:cnpm镜像会定期(通常每10分钟)从npm官方仓库同步最新的包信息和版本,确保与npm官方仓库保持相对同步。
  2. 加速下载:用户通过cnpm命令安装包时,实际上是从淘宝的国内服务器上下载,而非npm官方的国外服务器,大大提高了下载速度。
  3. 命令替换:cnpm的设计使得其命令行使用方式与npm基本一致,开发者可以无缝替换原有的npm命令为cnpm,无需改变原有开发习惯。

四、pnpm

pnpm(Performance npm,高性能的npm)是一个先进的Node.js包管理器,旨在解决npm和yarn在性能、磁盘空间占用以及依赖管理方面的问题。它是由npm和yarn发展而来,但引入了新的机制来优化包的安装和管理过程,提供更快的安装速度和更高效的磁盘使用。

1、安装

通过npm直接安装pnpm:

npm install -g pnpm

或者,使用curl或wget从官方发布的安装脚本安装:

curl -L https://pnpm.io/install.sh | sh

2、运作原理:

  1. 存储机制:pnpm采用了一个创新的存储策略,将所有依赖包存储在一个全局的存储空间(默认位于用户主目录下的.pnpm-store/v3,或者特定于操作系统的相应位置),而不是每个项目各自的node_modules目录中。
  2. 硬链接与符号链接:当安装依赖时,pnpm会在全局存储中检查该包是否已存在。如果存在,则在当前项目的node_modules目录中创建对该包的硬链接,而不是复制文件。这使得多个项目可以共享同一个包文件,极大地节省了磁盘空间。
  3. 精确的依赖管理:pnpm通过生成和维护一个详细的依赖关系树,确保每个项目都有一个确定性的依赖结构,解决了npm的“子依赖地狱”问题。

3、pnpm与npm区别

安装速度

  • pnpm 通常比 npm 的安装速度快,尤其是对于大型项目或依赖树复杂的情况。因为它只需要从网络下载一次包,之后就可以通过链接重复利用这些包,避免了重复下载和安装。

存储机制

  • npm 使用传统的 node_modules 目录结构,每个项目中的依赖都会被完整地复制到该项目的 node_modules 文件夹中,这可能导致大量的磁盘空间占用,尤其是在不同项目之间存在许多相同依赖的情况下。
  • pnpm 则采用内容寻址存储和硬链接/符号链接技术。它将依赖包存储在一个全局的存储区,并在各个项目的 node_modules 目录中通过链接指向这些共享的包文件。这种方法极大地减少了磁盘空间使用,并且提高了依赖安装的速度。
    盘空间占用,尤其是在不同项目之间存在许多相同依赖的情况下。
  • pnpm 则采用内容寻址存储和硬链接/符号链接技术。它将依赖包存储在一个全局的存储区,并在各个项目的 node_modules 目录中通过链接指向这些共享的包文件。这种方法极大地减少了磁盘空间使用,并且提高了依赖安装的速度。

猜你喜欢

转载自blog.csdn.net/m0_59415345/article/details/139908909