如何在NPM和Yarn之间做出选择

450 阅读10分钟

在NPM和Yarn之间做出选择

Node.js提供了一个开源的、跨平台的运行环境,用于在浏览器之外执行JavaScript代码。Node.js是构建高度可扩展的数据密集型和实时的后端服务(API)的理想选择,它为我们的客户应用提供了动力。

它允许你创建用JavaScript编写的动态网页。这些包括视频流网站、单页应用程序、在线聊天应用程序等。这些页面在被发送到浏览器之前在服务器上执行。Node.js已经在JavaScript社区中获得了巨大的发展。

像Netflix、Uber和eBay这样受欢迎的企业公司使用Node.js来开发他们的应用程序。Node.js受欢迎的原因之一是有多样化的开源包和库。

流行的包括Express.js、Lodash、AsyncJS、Meteor、Sails和其他。这些框架是为Node.js构建的。它们有助于缓解整个网络开发管道。然而,要在你的Node.js项目中使用它们,你需要一个package manager

包管理器使你能够安装、卸载、管理包的依赖性和二进制文件,以及更新包的版本。这里有两个主要角色,Node包管理器(NPM)和Yarn

它们将安装、升级、配置或删除Node.js包的过程自动化。本指南将帮助你了解NPM和Yarn的区别。

包管理器的使用

  • 它用于为你的应用程序下载代码包。这些包是独立的工具,你可以在你的项目中立即使用。
  • 你可以管理多个版本的包和依赖关系。
  • 当底层软件包更新时,你可以轻松地更新你的应用程序。

一个概述

最初,Yarn被称为是使用Node.js包的项目的NPM替代工具。Yarn是为了弥补NPM的缺点和误区,因为它更快、更稳定、更安全。

它还提供了一个锁文件(yarn.lock ),确保同一项目在不同电脑上的软件包版本稳定性。从那时起,NPM很好地应对了Yarn 竞争,并保持了其顶级软件包管理器的地位。它进行了许多渐进式的更新,以加快包的安装,稳定包的依赖性。

NPM已经提高了它的安全性。它有一些工具可以帮助你审计你的依赖关系树。在更新之前,为了给你的依赖关系生成一个锁文件,你必须运行npm shrinkwrap

在最新的更新中,NPM会自动创建一个锁文件(package-lock.json ),就像你在使用Yarn时那样。基本上,Yarn并没有完全取代NPM。尽管如此,你能用NPM做的事情也能用Yarn实现。

作为一个开发者,你需要选择适合你的软件包管理器。让我们简单地讨论一下这两者之间的一些特点和功能。

什么是NPM?

NPM是Node Package Manager的缩写。

NPM做两件事。

  1. 它作为一个在线平台。一个NPM注册中心,人们,包括你,可以在这里创建、上传、发布和分享工具(Node.js包)。这些包是开源的。每个人都可以搜索和使用这个在线平台(NPM注册处)上发布的工具。

  2. 它是命令行工具。它可以帮助你与我刚才提到的在线平台互动。你可以用命令行工具做的几件事包括安装和卸载软件包。

什么是Yarn?

Yarn是一个由Facebook创建的JavaScript包管理器。Yarn是Yet Another Resource Negotiator的缩写。它提供了与NPM类似的功能。在安装、卸载和管理来自NPM注册表或GitHub仓库的软件包依赖关系时,它是NPM的一个替代品。

安装

NPM与Node.js Runtime捆绑在一起。它是Node.js默认的包管理器。换句话说,当你安装Node.js时,NPM会被安装。

要使用NPM安装一个包,你可以使用下面的语法。

npm install <package name>.

package name 可以是你想在项目中使用的任何包。例如,要安装Express,运行npm install express

一些更独特的NPM包的安装包括。

  • npm installs <package name> -- global.这些是你安装到你的计算机系统的本地路径中的包,而不是你的项目位置。这样的包可以被你创建的任何项目所使用或访问。

  • npm install <package name> -dev.标志-dev ,允许你安装任何你的工作不需要的包来运行。它们主要用于开发目的,如测试、尺寸捆绑、转发代码等。

另一方面,要使用Yarn,你必须自己单独安装它。你应该安装Node.js来使用Yarn。

要安装Yarn,运行这个命令,npm install yarn -- global 。这将在全局范围内安装Yarn,这样你就可以在任何你想运行的目录下运行它。

Yarn的语法有一点不同。要用Yarn安装一个包,请使用以下命令。

yarn add <package name>.

例如,你会使用yarn add Express ,将Express安装到你的项目中。

下面是一些常用的NPM与Yarn命令的总结。

NPM and Yarn commands

图片来源

一些相同的命令包括。

similar NPM commands

请确保你直接从你的项目目录中运行软件包安装命令。

速度

NPM和Yarn的主要区别之一是它们如何处理包的安装过程。Yarn以并行方式安装软件包。Yarn被优化为同时获取和安装多个包。如果你正在安装五个包,而其中两个包的安装时间很长,Yarn会过去把这些包并排安装。

另一方面,NPM会一个一个地安装每个包。它独立地获取每个包。这意味着,如果你安装一个有五个包的列表,NPM将执行一个串行安装过程。平行安装是Yarn在速度竞赛中击败NPM的原因之一。

当你安装一个包时,这两个包管理器会保存离线缓存。然后你可以从内存缓存中安装你之前安装的包,即使你在离线的时候。

Yarn有一个管理良好的离线缓存。你用零次安装一个离线包,这个概念叫做 Zero installs.

Zero installs 将缓存存储在你的项目目录中。当你推送 或 等命令时,Yarn 会创建一个 文件。这个文件由Node.js用来加载你的项目包的依赖层次结构组成。因此,你几乎可以在 。yarn install yarn add <package name> .pnp.cjs zero time

注意:Zero install 工作流是可选的。你仍然可以为你的项目坚持使用全局缓存

锁定文件的生成

锁定文件是一个包含你的项目运作所需的所有依赖关系的列表。这个文件 "锁定 "了你的依赖版本。这样,当其他人运行yarn installnpm install ,他们将收到锁文件中列出的确切的依赖版本。这确保你的团队拥有与你相同的软件包版本。这也有助于防止由于引入更新的、未经测试的软件包版本而可能出现的错误。

安全性

你从NPM注册表下载东西,不一定知道你在下载什么。然而,这些软件包管理器在每次安装时都会进行安全检查。

Yarn在幕后检查,确保你没有下载流氓脚本或与你的项目依赖相冲突的东西。安全性是Yarn的核心功能之一。

在过去,NPM是非常脆弱的,没有提供一个安全的安装过程。这使得其他软件包可以被临时纳入,导致可能的安全系统漏洞。此后,它在最近的更新中大大改进了安全检查。

校验和与安全哈希算法(SHA-512)的比较

校验和是一种数学上的错误检测算法。它是在将数据从一台计算机传输到另一台计算机时,从原始数据中提取的一个数据块,用于错误检测。它检查在数据传输或存储过程中可能出现的任何错误。这有助于确保数据的完整性。

在数据传输之前,发送方将创建一个计算校验和的消息。这个消息(数据包)将被附加到原始数据上。

然后,接收器将计算一个不同的校验和,以验证发送的数据。如果两个校验和值相等,那么就没有发现错误,数据被接受;否则,数据被拒绝。

Yarn使用Checksum来确保数据的完整性。当一个软件包被安装,并即将被执行时,Yarn将执行校验和完整性检查,以检测任何被传输到你的计算机的恶意信息。

NPM使用SHA-512 来检查你安装的软件包的完整性。NPM将每个安装的软件包的SHA-512 字符串存储在package-lock.json 文件中,如下图所示。

"lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
}

NPM将使用这个完整性SHA-512 密钥,在锁文件中的每个软件包块中进行完整性检查。

在安装过程中,NPM还对每个软件包进行审计,并通知你可能存在的漏洞。

NPM Package Audit

你可以再次运行npm audit 来检查你的整个依赖关系树。如果发现任何漏洞,NPM会给你一个安全建议。

NPM Audit Report

要修复这些软件包的漏洞,请运行npm audit fix ,你的依赖关系树就会被修复。

audit fix

使用的方便性

在选择软件包管理器之前,要考虑的一件事是看哪个界面是用户友好的。这包括运行npm installyarn add 等命令后的命令行终端的外观。

NPM和Yarn有不同的命令行界面。它们都是用户友好的,都有良好的用户体验。这一点在使用npm inityarn init 等命令时就很明显。它们都有一个互动指南,帮助用户初始化一个Node.js项目。

NPM与Yarn的最新更新

Yarn和NPM都在不断地更新,以改进它们当前的功能,同时也在增加新的功能,如NPXPnP

NPX

NPX 指的是Node Package Executor。它是NPM版本的一个新的补充 。5.2.0 or higherNPX帮助你执行一次性的命令。有了NPX,你可以从NPM注册表中执行包,而不用把它们安装到你的项目依赖中。

还有更多的功能,你可以从使用NPX中受益。

Yarn2 (贝瑞)

Yarn推出了Yarn2,昵称为Berry。这个新的Yarn版本有令人兴奋的功能,如即插即用、约束条件、离线安装、零安装、工作空间和Yarn Dlx(新的Yarn NPX)。

这里最重要的新增功能是。

  1. Plug'n'Play - 这是一个替代的安装策略。Plug'n'Play不是生成一个node_modules 目录,而是让Node.js来解决,它生成一个单一的pnp.js 文件,让Yarn告诉我们在哪里找到我们的包。

这意味着

  • 没有更多的node_modules
  • 减少软件包的安装时间,最高可达70%。
  • 当你忘记列出你的依赖关系时,Plug'n'Play会警告你。
  • 更快的项目启动时间。
  1. 约束 -约束提供了一种使用prologue(一种声明性编程语言)指定通用规则的方法,以管理你项目中的依赖关系。这使你能够编写规则,并确保你的资源库中没有冲突的依赖关系。

  2. 改进的工作空间 -工作空间允许你创建一个mono 仓库来管理多个项目的依赖关系。这使得多个项目可以相互参照。应用于一个项目库的修改会应用于其他项目库。

总结

这两个软件包管理器在管理和维护你的项目依赖关系树方面非常出色。它们是可靠的,而且它们有一个伟大的、支持性的JavaScript社区。在增加功能后,NPM几乎与Yarn相同。

两者之间没有多少可以比较的地方。你几乎可以在每一种情况下使用Yarn,就像你使用NPM一样。它的目的是要成为一个直接的替代品。

两者之间的选择可能取决于个人偏好、性能(包安装速度)、社区支持或易用性。