Yarn vs npm:你需要知道的一切

Ivaylo Gerchev
分享

在本教程中,我们将比较Yarn和npm这两种最流行的包管理器。我们将把它们放在一起,探讨它们各自的优点和缺点,以帮助您选择在项目中使用哪一种。

列出基本要素

在过去,一个简单的文本编辑器就足以让开发人员创建和管理他们的大部分项目。但从那时起,网络发生了翻天覆地的变化。现在,即使是一个相当简单的项目,也会有成百上千个带有复杂嵌套依赖关系的脚本,如果没有某种自动化工具,这些脚本是根本不可能管理的。这就是包管理器发挥作用的地方。

一个包管理器是一种以各种方式自动处理项目依赖项的工具。例如,在包管理器的帮助下,我们可以安装、卸载、更新和升级包、配置项目设置、运行脚本,等等。所有艰苦而乏味的工作都由包管理器完成,只留给我们有趣的部分——编码本身。

npm表示节点包管理器。它发布于2010年,开启了web开发的新时代。在此之前,项目依赖项都是手动下载和管理的。npm是把Web推向下一个层次的魔杖。

NPM实际上包括三件事:

  • 一个网站用于管理NPM体验的各个方面
  • 一个注册表用于访问JavaScript包的广泛公共数据库
  • 一个命令行界面(CLI)用于通过终端与npm交互

然而,当大多数人谈论npm时,他们通常指的是最后一个——CLI工具。它作为默认包管理器随每个新的Node安装一起发布。这意味着你可以马上开始使用它。

如果你想深入了解如何使用npm,请咨询我们的节点包管理指南

代表Yet Another Resource Negotiator。Yarn包管理器是npm的替代品,由Facebook于2016年10月发布。Yarn最初的目标是解决npm的缺点,比如性能和安全问题。Yarn很快被定位为安全、快速、可靠的JavaScript依赖项管理工具。

但是npm团队吸取了教训,并通过实现缺失的特性迅速填补了npm的空白。

让我们快速穿越时间来看看大局:

  • 2010年:npm发布,支持Node。
  • 2016: Yarn发布。它表现出比npm更好的性能。它还生成了一个yarn.lock文件,使共享和准确复制回购更容易和可预测。
  • 2017年:NPM 5发布。它提供自动生成package-lock.json文件回复yarn.lock
  • 2018年:NPM 6发布,提高了安全性。现在npm在安装依赖关系之前检查安全漏洞。
  • 2020年:Yarn 2和npm 7发布。这两个包都有很棒的新特性,我们将在本教程后面看到。
  • 2021年:Yarn 3发布了各种改进。

现在,这两个包管理器在包管理竞赛中并驾齐驱,提供相似的特性和功能。但仍有一些差异有助于决定我们选择使用哪一种。

在本教程的其余部分,我们将探索npm和Yarn之间的主要异同。

Yarn vs npm:安装比较

我们将从npm和Yarn的安装过程开始比较探索。

安装包管理器本身

正如我上面提到的,npm是预先安装在Node上的,所以不需要手动安装npm。

相反,Yarn需要显式地安装。首先,我们需要全局安装Yarn:

npm安装- g

然后,我们可以在每个项目中通过在项目中设置所需的版本来使用它。我们通过运行纱套版本在项目根目录下执行如下命令:

版本的浆果

在这种情况下,浆果是我们要设置的版本。

如果我们想要更新到最新版本,我们运行这个:

最新版本

使用Yarn,我们可以为每个项目使用不同的版本。

要对npm做同样的事情,你需要nvm(节点版本管理器)安装。以下是如何使用nvm安装多个版本的Node

安装项目依赖项

现在,让我们看看如何安装项目依赖项。

当我们奔跑npm安装,依赖项按顺序依次安装。终端中的输出日志信息丰富,但阅读起来有点困难。

要使用Yarn安装包,我们运行命令。Yarn并行安装包,这是它比npm更快的原因之一。如果您使用的是纱线1,您将看到纱线输出日志是干净的、视觉上可区分的和简短的。为了便于理解,它们还以树形排列。但是这在版本2和3中有所改变,其中的日志不是那么直观和人类可读。

到目前为止,我们已经看到npm和Yarn有不同的安装包的命令。在下一节中,我们将探索更多命令。

比较npm和Yarn命令

npm和Yarn共享许多命令,但也有许多不相同的命令。让我们首先探索一些相同的命令:

  • npm init|纱init:创建一个新包
  • npm运行|纱线运行命令中定义的脚本package.json
  • npm测试|纱线测试:测试包
  • npm发布|纱发布:发布包
  • NPM缓存清理|纱线缓存清理:删除缓存中的所有数据

这些命令可以方便地在两个管理器之间切换,但是有一些不相同的命令可能导致混淆。让我们看看下一个列表中都有什么:

  • npm安装|:安装依赖项
  • NPM安装[包]|加纱[包纱]:安装包
  • NPM install——save-dev [package]|Yarn add -dev [package]:将包作为开发依赖项安装
  • NPM卸载[包]|拆纱[包纱]:卸载包
  • 卸载NPM包|拆纱[包纱]:卸载开发依赖包
  • npm更新|纱升级:更新依赖项
  • NPM更新[包]|纱线升级【包】:更新包

Yarn还有一些独特的命令,这些命令没有npm对应的命令。例如,为什么命令显示需要某个包的原因:它可能是依赖项、本机模块或项目依赖项。

Yarn vs npm:速度和性能

每当Yarn或npm需要安装一个包时,它们都会执行一系列的任务。在npm中,这些任务是按顺序逐个包执行的,这意味着它将等待一个包完全安装后才能继续下一个包。相反,Yarn并行执行这些任务,从而提高了性能。

虽然这两个管理器都提供缓存机制,但Yarn似乎做得更好一些。正如我们将在特性比较部分看到的那样,通过实现零安装范例,它几乎可以在短时间内安装包。它缓存每个包并将其保存在磁盘上,因此在此包的下一次安装中,您甚至不需要internet连接,因为包是从磁盘离线安装的。

尽管Yarn有一些优势,但Yarn和npm在上一个版本中的速度是相当的。所以我们不能在这里定义干净利落的赢家。

Yarn vs npm:安全性比较

对npm的主要批评之一是关于安全性的。以前的npm版本有两个严重的安全漏洞

从版本6开始,npm会在安装过程中审计包,并告诉你是否发现了任何漏洞。我们可以通过运行来手动进行检查npm审计针对已安装的包。如果发现任何漏洞,npm将为我们提供安全建议。

NPM审计报告不安全的包

正如你在上面的截图中看到的,我们可以运行NPM审计修复修复包漏洞,如果可能的话,依赖关系树将被修复。

Yarn和npm都使用加密哈希算法确保包装的完整性。

Yarn vs npm:一个特性比较

就像命令一样,npm和Yarn有一些共同的特性,但也有一些不同之处。让我们首先探讨这两个包管理器共享的共同特性。

生成锁文件

package.json, npm和Yarn用来跟踪项目依赖项的文件,版本号并不总是准确的。相反,您可以定义一系列版本。这样,你可以选择一个包的主要版本和次要版本,但允许npm安装最新的补丁,这可能会修复一些错误。

在一个理想的世界语义版本控制,补丁版本将不包括任何破坏性更改。但不幸的是,情况并非总是如此。npm所采用的策略可能会导致两台机器的结果相同package.json文件,但是安装了不同版本的包-这可能会引入错误。

为了避免包版本不匹配,在包锁定文件中固定了确切的安装版本。每次添加一个模块时,npm和Yarn都会创建(或更新)一个package-lock.json而且yarn.lock文件分别。通过这种方式,您可以保证另一台机器安装完全相同的包,同时仍然具有中定义的允许版本范围package.json

使用工作空间

工作区允许您拥有一个monorepo管理多个项目之间的依赖关系。这意味着您有一个单一的顶级根包,它有多个称为工作区的子包。

远程运行脚本

npx命令用于运行脚本/ node_modules。斌.它还允许你在npm注册表中执行包,而无需将它们安装到你的项目依赖项中。例如,你可以通过运行以下命令创建一个新的React应用程序:

create-react-app my-app

在Yarn中,您可以通过使用等效的方法来实现相同的结果dlx命令:

DLX create-react-app my-app

我们将要探索的其他特性都是Yarn独有的。

零安装

零安装将缓存存储在项目目录中.yarn文件夹中。当您使用诸如纱线添加<包>, Yarn将创建一个.pnp.cjs文件。该文件包含Node用来加载项目包的依赖层次结构。因此,您几乎可以在零时间访问它们。

塞’“娱乐

即插即用是另一种安装策略。而不是生成node_modules目录,并将解析留给Node, Yarn生成一个单独的.pnp.cjs将包映射到它们在磁盘上的位置及其依赖项列表的文件。这个特性可以导致更快的项目启动,更好的优化依赖树,更快的安装时间,当然也消除了对node_modules文件夹中。

许可证

Yarn内置了一个许可检查器,在开发应用程序时,它在不同的场景中非常有用。

Yarn vs npm:选择哪个包管理器

我们已经讨论了npm和Yarn的各种相似点和不同点,但我们还没有确定哪个更好,应该选择哪个。一如既往,答案取决于我们的愿望和要求。

作为一般指导,我想提出以下建议:

  • 如果你对当前的工作流程感到满意,不想安装额外的工具,并且没有太多的磁盘空间,那么可以选择npm。

  • 如果你想要一些很棒的功能,比如Plug 'n 'Play,你需要一些npm中没有的功能,并且你有足够的磁盘空间,那么就选择Yarn。

如果你仍然很难在npm和Yarn之间做出明确的决定,那么你可以检查一下规划,它试图结合两个包管理器的优点,是包管理池中的第三条大鱼。

Yarn vs npm:结论

我们已经看到了包管理器对于现代web开发的重要性,并且我们比较了市场上最受欢迎的两个竞争对手。它们都有各自的优点和缺点,为了选择最适合你的,你需要对你的要求有一个清晰的概念。决定哪个更适合你的最好方法是两个都试一下,看看哪个表现更好。

最后,不要想太多。只需选择一个,然后进入有趣的部分:创建伟大的应用程序!

Baidu