首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-04-24 07:21
  • 3863
  • 13034
blog.csdn.net

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

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

文章目录

  • 详解yarn 、npm 、cnpm 、pnpm等包管理工具
    • 一、npm
      • 1、安装
      • 2、常见配置
      • 3、npx
      • 4、npm install的原理
    • 二、yarn
      • 1、安装
      • 2、yarn与npm的区别
      • 3、特点
      • 4、缺陷
    • 三、cnpm
      • 1、**安装**
      • 2、特点
    • 四、pnpm
      • 1、安装
      • 2、运作原理:
      • 3、pnpm与npm区别

一、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.json和package-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.json 和 node_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.json或npm-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 可以通过多种方式安装,以下是几种常见的安装方法:

  • npm 安装(适用于已安装 Node.js 的环境):
npm install -g yarn
  • 1
  • 直接下载安装脚本:从 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
  • 1

这行命令会全局安装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
  • 1

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

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

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的VT.馒头的文章"https://blog.csdn.net/m0_59415345/article/details/139908909"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top