npm、pnpm和yarn 的区别

包管理工具是JavaScript开发中不可或缺的一部分,它们可以帮助我们方便地安装、更新、删除和管理项目所依赖的各种库和模块。

目前,最流行的包管理工具有npm、yarn和pnpm,它们各有各的特点和优劣势。

本文将试着对这三个工具进行全面的对比。

npm

npm是Node.js的官方包管理工具,它于2010年随着Node.js一起发布,是最早的JavaScript包管理工具之一。

npm的目标是提供一个简单、可靠、高效的方式来管理Node.js项目的依赖关系。npm围绕着语义版本控制(semver)的思想而设计,通过一个名为package.json的文件来记录项目的元数据和依赖项。npm还提供了一个名为npm registry的在线服务,用于存储和分发公开或私有的包。

特点

npm的主要特点有:

官方支持

npm是Node.js的官方包管理工具,它与Node.js的版本和特性紧密地配合,同时也得到了Node.js社区的广泛支持和贡献。

丰富的生态

npm拥有超过160万个公开的包,覆盖了JavaScript开发的各个方面,是目前最大的包仓库之一。npm还提供了一些其他的服务,如npm audit、npm ci、npm run等,以增强开发者的体验和安全性。

简单易用

npm的使用非常简单,只需要几个基本的命令,如npm init、npm install、npm update等,就可以完成项目的初始化、安装、更新等操作。npm的文档也非常完善,提供了详细的指南和参考。

使用实例

# 在项目中安装依赖项
npm install lodash
# 全局安装包
npm install -g create-react-app
# 查看已安装的包
npm list
# 清空缓存
npm cache clean

pnpm

pnpm是由Zoltan Kochan开发的一个新的包管理工具,它于2016年11月发布,但并没有像yarn那样迅速流行起来。

pnpm的主要目标是解决npm和yarn的扁平化安装方式带来的重复和幽灵依赖的问题,即同名的包只会提升一个版本的,其余的版本依然会复制多次,而且某些依赖项可能会被意外地提升或缺失。

pnpm通过引入一个名为store的全局缓存目录来存储所有安装过的包,然后通过硬链接和软链接的方式来组织node_modules目录,确保每个包都能访问到自己的依赖项,而不会访问到其他包的依赖项。

这样可以既保证依赖项的版本一致性,又节省磁盘空间和安装时间。

特点

pnpm的主要特点有:

高效节省

pnpm通过引入一个名为store的全局缓存目录来存储所有安装过的包,然后通过硬链接和软链接的方式来组织node_modules目录,确保每个包都能访问到自己的依赖项,而不会访问到其他包的依赖项。这样可以既保证依赖项的版本一致性,又节省磁盘空间和安装时间。

版本一致

pnpm通过引入一个名为pnpm-lock.yaml的文件来锁定依赖项的版本和内容,确保每次安装都能得到相同的结果,避免了因为依赖项的变化而导致的错误和不一致。

硬链接安装

pnpm通过使用硬链接的方式来安装依赖项,而不是复制文件,这样可以避免重复的依赖项和文件路径长度的问题,而且可以提升安装的速度和稳定性。

使用实例

# 在项目中安装依赖项
pnpm add lodash
# 全局安装包
pnpm add -g create-react-app
# 查看已安装的包
pnpm list
# 清空缓存
pnpm cache clean

yarn

yarn是由Facebook、Google、Expo等公司联合开发的一个新的包管理工具,它于2016年10月发布,迅速受到了开发者的欢迎。

yarn的主要目标是解决npm安装的不确定性问题,即不同的开发者可能会安装同一个项目的不同版本的依赖项,导致难以调试的错误。yarn通过引入一个名为yarn.lock的文件来锁定依赖项的版本和内容,确保每次安装都能得到相同的结果。

yarn还通过并行化、缓存、离线等技术来提升安装的速度和稳定性。

特点

yarn的主要特点有:

快速稳定

yarn通过并行化、缓存、离线等技术来提升安装的速度和稳定性,它可以在几秒钟内完成大型项目的安装,而且不会因为网络或其他因素而失败。

可预测

yarn通过引入yarn.lock文件来锁定依赖项的版本和内容,确保每次安装都能得到相同的结果,避免了因为依赖项的变化而导致的错误和不一致。

灵活创新

yarn通过引入Plug’n’Play模式来摒弃node_modules目录,而是通过一个名为.pnp.js的文件来管理依赖项的解析和加载,这样可以进一步节省磁盘空间和安装时间,但也需要对Node.js的模块系统进行一些修改和适配。

使用实例

# 在项目中安装依赖项
yarn add lodash
# 全局安装包
yarn global add create-react-app
# 查看已安装的包
yarn list
# 清空缓存
yarn cache clean

比较

安装速度

  • npm: 相对较慢,特别是在有大量依赖项的项目中。

  • pnpm: 安装速度较快,尤其在多项目工作区中。

  • yarn: 使用并行下载,速度相对较快。

下面是三个工具执行不同命令的性能对比:

pnpm 的性能优势十分明显。

磁盘空间占用

  • npm: 默认将依赖项复制到项目的node_modules目录,可能导致重复占用磁盘空间。

  • pnpm: 通过符号链接共享依赖项,减少了磁盘空间占用。

  • yarn: 在离线模式下,通过缓存机制减少了磁盘空间占用

并发安装

  • npm: 不支持并发安装,会一个一个地安装依赖项。

  • pnpm: 支持并发安装,提高了安装速度。

  • yarn: 使用并行下载,速度相对较快。

稳定性

  • npm: 稳定、成熟,广泛使用。

  • pnpm: 相对较新,但社区正在不断发展。

  • yarn: 由Facebook维护,稳定性较高。

哪个更好?

不同的工具有不同的优劣势,适合不同的开发场景和需求。

你可以根据你的项目的特点和目标,以及你对速度、稳定性、兼容性、创新性等方面的偏好,来选择最适合你的工具。

  • 如果你注重生态系统的完备性,选择npm;

  • 如果你追求更快的安装速度和较小的磁盘占用,选择pnpm;

  • 如果你需要离线模式和确保包版本一致性,选择yarn。

小结

npm是默认选择,稳定且易于使用。pnpm通过共享依赖项减少磁盘空间占用,适用于需要优化空间的项目。yarn通过并行下载和版本锁定提供了更快、更可靠的安装。

至于用什么,看我们个人喜好。然后有一点,最好不要混用,不然会有未知的错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/305400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-PyQt5树莓派上位机

Python-PyQt5树莓派上位机 一个使用PythonQT设计的树莓派的上位机,功能大概如下 1.笔记本电脑与树莓派的通讯是否成功显示(给个信号显示判断是否通讯成功); 2.阈值的设置显示; 3.图像成像的显示; 4.是否发生…

9.建造者模式

文章目录 一、介绍二、代码三、实际使用总结 一、介绍 建造者模式旨在将一个复杂对象的构建过程和其表示分离,以便同样的构建过程可以创建不同的表示。这种模式适用于构建对象的算法(构建过程)应该独立于对象的组成部分以及它们的装配方式的…

学习笔记——C++二维数组

二维数组定义的四种方式: 1,数据类型 数组名[ 行数 ][ 列数 ]; 2,数据类型 数组名[ 行数 ][ 列数 ]{{数据1,数据2},{数据3,数据4}}; 3,数据类型 数组名[ 行数…

【计算机网络】TCP原理 | 可靠性机制分析(二)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌 T…

如何做好档案统一管理?

档案统一管理是指将一个组织或机构的所有档案资料进行集中管理和整理的一种管理方式。档案统一管理的目标是确保档案的完整性、准确性和可访问性,提高档案的利用价值和管理效率。 要做好档案统一管理,需要以下几个步骤: 1. 确定档案的分类与命…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(2)

前言 前文介绍了 NXP S32K3 以太网 RMII 接口调试的开发环境搭建,下面开始详解软件调试步骤。没看过第一节的小伙伴请移步《【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(1)》,话不多说我们直接进入正题。 lwip Stack 介绍 …

debug OpenBLAS library 和 应用示例

1. 构建openblas lib git clone gitgithub.com:OpenMathLib/OpenBLAS.git cd OpenBLAS/ 如果要安装在自定义文件夹中,可以修改 PREFIX 的定义: 将 PREFIX /opt/OpenBLAS 修改成 PREFIX ../local/ 然后构建: make -j make install 如果要…

09.面向对象进阶

面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。 property装…

OpenAI ChatGPT-4开发笔记2024-03:Chat之Tool和Tool_Call(含前function call)

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了,必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…

考公还是互联网?

来源 花了 10 小时检索,汇总的有效信息 V2EX,牛客,Google,Bing,广东省人事考试网,国家公务员局,B站,小红书,知乎,掘金,Github,公务员…

Rollup-plugin-bundle-analyzer VS Rollup-plugin-visualizer

分析和可视化Rollup打包后的文件的插件 Rollup-plugin-bundle-analyzerRollup-plugin-visualizer Rollup-plugin-bundle-analyzer和Rollup-plugin-visualizer都是用于分析和可视化Rollup打包后的文件的插件,但它们在功能和使用方式上存在一些差异。 Rollup-plugi…

低成本高回报:如何利用免版素材库提升设计品质?

免版素材库起源于互联网的发展,是指一种包含大量图片、图标、字体等创意资源的网站或平台,这些资源多为设计师和相关行业人士创作,并免费提供给用户使用。免版素材库的资源通常遵循一定的授权协议,如CC0(Creative Comm…

Python pip 常用指令

前言 Python的pip是一个强大的包管理工具,它可以帮助我们安装、升级和管理Python的第三方库。以下是一些常用的pip指令。 1. 安装第三方库 使用pip安装Python库非常简单,只需要使用pip install命令,后面跟上库的名字即可。 # 安装virtuale…

【leetcode 447. 回旋镖的数量】审慎思考与推倒重来

447. 回旋镖的数量 题目描述 给定平面上 **n **对 互不相同 的点 points ,其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。 返回平…

加速科技ST2500 数模混合信号测试设备累计装机量突破500台!

国产数字机,测试中国芯!新年伊始,国产半导体测试设备领军企业加速科技迎来了振奋人心的一刻,ST2500 数模混合信号测试设备累计装机量突破500台!加速科技凭借其持续的创新能力、完善的解决方案能力、专业热忱的本地化服…

企业级快速开发平台可以用在什么行业?优点多吗?

应用专业的企业级快速开发平台可以带来什么效果?目前,低代码技术平台在很多领域都获得了广泛应用和推广,在实现高效率办公、流程化办公和数字化发展中扮演了非常重要的角色,具有举足轻重的作用。针对这个话题,现在将给…

外汇天眼:台北妇女轻信假投资诈骗话术,小赚1万却惨赔1500万

当今社会物价急速上涨,许多民众为了避免资产因通膨缩水,纷纷开始寻找各种能增加收入的渠道,因此投资理财日渐受到重视。 然而,诈骗集团也注意到这趋势,并且推出虚假的投资平台或方案,以各种话术行骗。 不久…

【css】快速实现鼠标悬浮变色效果

<div class"nav-item"><div class"ic-img"></div><div>切换</div> </div>.nav-item {width: 100rem;height: 45rem;line-height: 45rem;display: flex;text-align: center;justify-content: center;align-items: cent…

用python提取word中的所有图片

使用word中提取的方式图片会丢失清晰度&#xff0c;使用python写一个脚本&#xff0c;程序运行将弹出对话框选择一个word文件&#xff0c;然后在弹出一个对话框选择一个文件夹保存word中的文件。将该word中的所有图片都保存成png格式&#xff0c;并命名成image_i的样式。 程序…

go image.DecodeConfig 和image.Decode 不能同时使用吗

问题场景&#xff1a;在同时使用go image.DecodeConfig 和image.Decode获取图片信息时&#xff0c;报错提示&#xff1a; 无法读取图像配置 image: unknown format package mainimport ("fmt""github.com/golang/freetype""image""image/d…