本文将深入探讨 Yarn 和 npm 这两大流行的 JavaScript 包管理器,并对它们各自的优缺点进行比较,助您为项目选择合适的工具。
核心要点
基础知识
在过去,简单的文本编辑器足以让开发者创建和管理大部分项目。但如今,网络发生了翻天覆地的变化。现在,即使是一个相当简单的项目,也可能包含数百甚至数千个脚本,以及复杂的嵌套依赖关系,如果没有某种自动化工具,这些依赖关系根本无法管理。这就是包管理器发挥作用的地方。
包管理器是一种工具,它可以以多种方式自动处理项目的依赖关系。例如,借助包管理器,我们可以安装、卸载、更新和升级包,配置项目设置,运行脚本等等。所有繁琐的工作都由包管理器完成,我们只需要专注于编码本身。
npm 代表 Node 包管理器 (Node Package Manager)。它于 2010 年发布,开启了 Web 开发的新时代。在此之前,项目依赖项是手动下载和管理的。npm 正是推动 Web 发展到更高水平的魔杖。
npm 实际上包含三部分:
但是,当大多数人谈论 npm 时,他们通常指的是最后一种——CLI 工具。它作为默认的包管理器与每个新的 Node 安装一起提供。这意味着您可以立即开始使用它。
如果您想深入了解 npm 的使用方法,请参阅我们的 Node 包管理器指南。
Yarn 代表 Yet Another Resource Negotiator(另一种资源协商器)。Yarn 包管理器是 npm 的替代方案,由 Facebook 于 2016 年 10 月发布。Yarn 的最初目标是解决 npm 的缺点,例如性能和安全问题。Yarn 迅速成为安全、快速和可靠的 JavaScript 依赖项管理工具。
但 npm 团队吸取了教训,并通过实现缺失的功能迅速弥补了 npm 的不足。
让我们快速回顾一下历史,以了解全局情况:
如今,这两个包管理器在包管理竞赛中不相上下,提供类似的功能。但仍然存在一些差异,有助于我们确定使用哪个。
在本教程的其余部分,我们将探讨 npm 和 Yarn 之间的主要异同。
Yarn 与 npm:安装比较
我们将从 npm 和 Yarn 的安装过程开始比较。
如上所述,npm 预装在 Node 中,因此无需手动安装 npm。
相反,Yarn 需要显式安装。首先,我们需要全局安装 Yarn:
npm install -g yarn
然后,我们可以通过在项目根目录中运行 yarn set version 命令,在每个项目的基础上使用它:
yarn set version berry
在这种情况下,berry 是我们想要设置的版本。
如果我们想更新到最新版本,我们运行以下命令:
yarn set version latest
使用 Yarn,我们可以为每个项目使用不同的版本。
要使用 npm 执行相同的操作,您需要安装 nvm(Node 版本管理器)。以下是如何使用 nvm 安装多个 Node 版本的方法。
现在,让我们看看如何安装项目依赖项。
当我们运行 npm install 时,依赖项会依次安装。终端中的输出日志信息丰富,但有点难以阅读。
要使用 Yarn 安装包,我们运行 yarn 命令。Yarn 并行安装包,这是它比 npm 更快的原因之一。如果您使用的是 Yarn 1,您会看到 yarn 输出日志简洁明了,视觉上易于区分。它们也以树状形式排序,便于理解。但在版本 2 和 3 中,日志并不那么直观易懂。
到目前为止,我们已经看到 npm 和 Yarn 有不同的安装包命令。在下一节中,我们将探讨更多命令。
比较 npm 和 Yarn 命令
npm 和 Yarn 共享许多命令,但也有一些不相同的命令。让我们首先探讨一些相同的命令:
这些命令使在两个管理器之间切换变得容易,但有一些不相同的命令可能会造成混淆。让我们在下一个列表中看看它们是什么:
Yarn 还有一些 npm 没有的独特命令。例如,why 命令显示需要包的原因:它可能是依赖项、本地模块或项目依赖项。
Yarn 与 npm:速度和性能
每当 Yarn 或 npm 需要安装包时,它们都会执行一系列任务。在 npm 中,这些任务是按包依次执行的,这意味着它会在一个包完全安装后才会继续下一个包。相反,Yarn 并行执行这些任务,从而提高了性能。
虽然这两个管理器都提供缓存机制,但 Yarn 似乎做得更好一些。通过实现零安装范例(我们将在功能比较部分看到),它能够几乎立即安装包。它缓存每个包并将其保存在磁盘上,因此下次安装此包时,您甚至不需要互联网连接,因为包是从磁盘离线安装的。
尽管 Yarn 有一些优势,但在其最新版本中,Yarn 和 npm 的速度相当。因此,我们在这里无法定义一个明确的赢家。
Yarn 与 npm:安全比较
对 npm 的主要批评之一是关于安全性的。之前的 npm 版本有一些严重的安全性漏洞。
从版本 6 开始,npm 在安装过程中会审计包,并告知您是否发现任何漏洞。我们可以通过对已安装的包运行 npm audit 来手动执行此检查。如果发现任何漏洞,npm 将向我们提供安全建议。
如上图所示,我们可以运行 npm audit fix 来修复包漏洞,如果可以修复,则依赖项树也将被修复。
Yarn 和 npm 都使用加密哈希算法来确保包的完整性。
Yarn 与 npm:功能比较
与命令一样,npm 和 Yarn 也共享一些功能,但也有一些区别。让我们首先探讨这两个包管理器共享的共同功能。
在 package.json(npm 和 Yarn 用于跟踪项目依赖项的文件)中,版本号并不总是精确的。相反,您可以定义一个版本范围。这样,您可以选择包的特定主要版本和次要版本,但允许 npm 安装可能修复某些错误的最新补丁。
在语义版本控制的理想世界中,补丁版本不会包含任何重大更改。但不幸的是,情况并非总是如此。npm 使用的策略可能会导致两台机器最终拥有相同的 package.json 文件,但安装了不同版本的包——这可能会引入错误。
为了避免包版本不匹配,已安装的精确版本会固定在包锁定文件中。每次添加模块时,npm 和 Yarn 分别创建(或更新)package-lock.json 和 yarn.lock 文件。这样,您可以保证另一台机器安装完全相同的包,同时仍然在 package.json 中定义了一系列允许的版本。
工作区允许您拥有一个 monorepo 来管理多个项目中的依赖项。这意味着您有一个单一的顶级根包,它有多个称为工作区的子包。
npx 命令用于从 ./node_modules/.bin 运行脚本。它还允许您从 npm 注册表执行包,而无需将它们安装到您的项目依赖项中。例如,您可以通过运行以下命令来创建一个新的 React 应用程序:
npm install -g yarn
在 Yarn 中,您可以使用等效的 dlx 命令来实现相同的结果:
yarn set version berry
我们将探讨的其余功能是 Yarn 独有的。
零安装将缓存存储在您的项目目录中,位于 .yarn 文件夹中。当您使用 yarn 或 yarn add
Plug’n’Play 是一种替代安装策略。Yarn 不会生成 node_modules 目录并将解析留给 Node,而是生成单个 .pnp.cjs 文件,该文件将包映射到磁盘上的位置及其依赖项列表。此功能可以加快项目启动速度,优化依赖项树,加快安装速度,当然还可以消除对 node_modules 文件夹的需求。
Yarn 内置了一个许可证检查器,这在开发应用程序的不同场景中非常有用。
Yarn 与 npm:选择哪个包管理器
我们已经介绍了 npm 和 Yarn 的各种异同,但我们还没有确定哪个更好,以及我们应该选择哪个。一如既往,答案取决于我们的愿望和需求。
作为一般指南,我总结如下建议:
如果您仍然难以在 npm 和 Yarn 之间做出明确的决定,那么您可以检查 pnpm,它试图结合这两个包管理器的优点,并且是包管理池中的第三大巨头。
Yarn 与 npm:结论
我们已经了解了包管理器对于现代 Web 开发的重要性,并且我们比较了市场上最流行的两个竞争对手。它们都有各自的优点和缺点,为了选择最适合您的,您需要清楚地了解您的需求。决定哪个更适合您的最佳方法是尝试两者,看看哪个性能更好。
最后,不要过度思考。只需选择一个,然后转到有趣的部分:创建很棒的应用程序!
关于 Yarn 与 npm 的常见问题解答
Yarn 和 npm 都是 JavaScript 的包管理器,但它们有一些关键区别。Yarn 由 Facebook 开发,旨在解决 npm 的一些缺点。它提供了更高的速度、更好的安全性以及更可靠的依赖项管理。另一方面,npm 是 Node.js 的默认包管理器,拥有更大的用户群。由于其更简单的语法,它也更容易被初学者使用。
是的,Yarn 通常比 npm 快。这是因为 Yarn 并行安装包,这大大加快了安装过程。另一方面,npm 顺序安装包,这可能会比较慢。
Yarn 有一个名为校验和的功能,它在执行已安装包的代码之前验证其完整性。这增加了一层 npm 不具备的额外安全层。但是,npm 在最近的版本中对其安全功能进行了重大改进。
虽然从技术上讲可以在同一个项目中同时使用 Yarn 和 npm,但不建议这样做。这是因为 Yarn 和 npm 以不同的方式处理依赖项,这可能会导致项目中的不一致和错误。
Yarn 使用锁定文件来锁定项目依赖项的版本。这确保了在所有机器上,每次安装都会产生 node_modules 中完全相同的文件夹结构。npm 也使用锁定文件,但它不如 Yarn 的严格。
由于其严格的锁定文件和校验和功能,Yarn 通常被认为比 npm 更可靠。但是,npm 在最近的版本中在可靠性方面取得了重大改进。
由于存在时间较长,npm 拥有更大的社区和更多可用的包。但是,Yarn 越来越受欢迎,并且拥有不断壮大的社区。
从 npm 切换到 Yarn 的一些挑战包括学习新的语法、迁移现有项目以及适应 Yarn 严格的依赖项管理。
Yarn 的语法与 npm 的语法略有不同。例如,要使用 Yarn 安装包,可以使用命令“yarn add”,而使用 npm,则可以使用“npm install”。
由于其更简单的语法和更大的社区,npm 通常被认为更容易被初学者使用。但是,Yarn 提供了更高级的功能,并且对于更有经验的开发人员来说是一个不错的选择。
以上是纱线与NPM:您需要知道的一切的详细内容。更多信息请关注PHP中文网其他相关文章!