Yarn vs npm: 你需要知道的一切 2021-10-31 默认分类 暂无评论 2467 次阅读 ![2021-10-31 00.27.29.jpg][1] **在本文章中,我们将比较Yarn与npm--两个最流行的软件包管理器。我们将把它们并列起来,探讨它们各自的优点和缺点,以帮助你选择在你的项目中使用哪一个。** **铺设基础知识** ---------- 在过去的好日子里,一个简单的文本编辑器就足以让开发者创建和管理他们项目的大部分内容。但从那时起,网络已经发生了巨大的变化。现在,即使是一个相当简单的项目,也会有成百上千的脚本,而且有复杂的嵌套依赖关系,如果没有某种自动化工具,根本无法管理。而这正是软件包管理器发挥作用的地方。 **软件包管理器**是一种工具,它以各种方式自动处理项目的依赖关系。例如,在软件包管理器的帮助下,我们可以安装、卸载、更新和升级软件包,配置项目设置,运行脚本,等等。所有艰苦和繁琐的工作都由包管理器完成,只留给我们有趣的部分 - 编码本身。 **npm**是Node Package Manager的缩写。它早在2010年发布,开始了网络开发的新时代。在此之前,项目的依赖性都是手动下载和管理的。npm是将Web推向新水平的魔杖。 npm实际上涉及三件事。 1. 一个用于管理你的npm体验的各个方面的网站 2. 一个用于访问广泛的JavaScript包公共数据库的注册中心 3. 一个命令行界面(CLI),用于通过终端与npm进行交互。 然而,当大多数人谈论npm时,他们通常是指最后一个--CLI工具。它作为一个默认的软件包管理器与每个新的Node安装一起提供。这意味着你可以立即开始使用它。 **Yarn**是Yet Another Resource Negotiator的缩写。Yarn软件包管理器是npm的替代品,由Facebook在2016年10月发布。Yarn的最初目标是处理npm的缺点,如性能和安全问题。Yarn很快被定位为一个安全、快速、可靠的JavaScript依赖管理工具。 但npm团队吸取了教训,通过实现缺失的功能迅速填补了npm的空白。 让我们快速穿越时空,看看大局。 - 2010年:npm发布,支持Node。 - 2016: Yarn发布了。它显示了比npm更大的性能。它还生成了一个yarn.lock文件,使得共享和精确复制repos更加容易和可预测。 - 2017年:npm 5发布。它提供了自动生成一个package-lock.json文件,以回答yarn.lock。 - 2018年:npm 6发布,改进了安全性。现在npm在安装依赖项之前会检查安全漏洞。 - 2020: Yarn 2和npm 7发布了。这两个软件包都有很大的新功能,我们将在本教程的后面看到。 - 2021: Yarn 3发布了,并进行了各种改进。 现在,这两个软件包管理器在软件包管理竞赛中并驾齐驱,提供类似的特性和能力。但仍有一些差异,有助于决定我们选择使用哪一个。 在本文章的其余部分,我们将探讨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 Version Manager)。下面是如何使用nvm安装多个版本的Node。 **安装项目的依赖性** 现在,让我们看看项目的依赖性是如何安装的。 当我们运行*npm install*时,依赖项是按顺序安装的,一个接一个。终端中的输出日志信息量很大,但有点难读。 为了用Yarn安装软件包,我们运行*yarn*命令。Yarn以并行方式安装软件包,这是它比npm更快的原因之一。如果你使用Yarn 1,你会看到Yarn的输出日志是干净的,视觉上可区分的,而且很简短。它们也是以树状形式排序的,便于理解。但在第2和第3个版本中,这种情况有所改变,日志不是那么直观和人可读的。 到目前为止,我们已经看到npm和Yarn有不同的命令来安装软件包。在下一节,我们将探讨更多的命令。 **对比npm和Yarn的命令** ----------------- npm和Yarn共享许多命令,但也有许多不相同的命令。我们先来探讨一些相同的命令。 - npm init | yarn init:创建一个新包 - npm run | yarn run:运行package.json中定义的一个脚本 - npm test | yarn test:测试一个软件包 - npm publish | yarn publish:发布一个软件包 - npm cache clean | yarn cache clean:删除缓存文件夹中的所有数据 这些命令使在两个管理器之间的切换变得很容易,但有一些不相同的命令会引起混淆。让我们在接下来的列表中看看它们是什么。 - npm install | yarn: install dependencies - npm install [package] | yarn add [package]: 安装一个包 - npm install --save-dev [package] | yarn add - -dev [package]: 安装一个包作为开发依赖。 - npm uninstall [package] | yarn remove [package]: 卸载一个软件包 - npm uninstall --save-dev [package] | yarn remove [package]: 卸载一个依赖开发的包 - npm update | yarn upgrade: 更新依赖关系 - npm update [package] | yarn upgrade [package]: 更新一个软件包 Yarn还有一些独特的命令,没有npm的对应命令。例如,why命令显示需要一个包的原因:它可能是一个依赖,一个本地模块,或一个项目依赖。 **Yarn与npm:速度与性能** ------------------ 每当Yarn或npm需要安装一个包时,它们会执行一系列的任务。在npm中,这些任务是按包的顺序执行的,这意味着它将等待一个包被完全安装后再继续下一个。相比之下,Yarn并行执行这些任务,提高了性能。 虽然两个管理器都提供了缓存机制,但Yarn似乎做得更好一些。通过实施零安装范式,正如我们将在功能比较部分看到的那样,它几乎能够在任何时间内安装软件包。它缓存了每一个软件包,并将其保存在磁盘上,所以在下一次安装这个软件包时,你甚至不需要有网络连接,因为软件包是从磁盘上离线安装的。 尽管Yarn有一些优势,但Yarn和npm的速度,在它们的最后版本中,是相当相当的。所以我们不能在这里定义一个明确的赢家。 **Yarn与npm:安全比较** ----------------- 对npm的主要批评之一是关于安全。以前的npm版本有几个严重的安全漏洞。 从第6版开始,npm在安装过程中会审计软件包,并告诉你是否发现了任何漏洞。我们可以通过对已安装的软件包运行*npm audit*来手动进行这种检查。如果发现任何漏洞,npm会给我们提供安全建议。 ![WeCom20211031-004105@2x.png][2] 正如你在上面的截图中所看到的,我们可以运行npm audit fix来修复包的漏洞,如果有可能的话,依赖树会被修复。 Yarn和npm都使用加密的哈希算法来确保软件包的完整性。 **Yarn与npm:功能比较** ----------------- 就像命令一样,npm和Yarn共享一些功能,同时也有一些区别。让我们首先探讨一下这两个软件包管理器的共同特征。 **生成一个lock文件** 在*package.json*中,即npm和Yarn记录项目依赖关系的文件中,版本号并不总是准确的。相反,你可以定义一个版本的范围。这样,你可以选择一个软件包的特定主要和次要版本,但允许npm安装可能修复一些错误的最新补丁。 在一个理想的语义版本管理的世界里,打过补丁的版本不会包括任何破坏性的变化。但不幸的是,情况并不总是如此。npm采用的策略可能会导致两台机器最终使用相同的*package.json*文件,但却安装了不同版本的软件包--这可能会引入错误。 为了避免包的版本不匹配,准确的安装版本被固定在包锁文件中。每次添加一个模块,npm和Yarn都会分别创建(或更新)一个*package-lock.json*和*yarn.lock*文件。这样,你就可以保证另一台机器安装的是完全相同的软件包,同时还可以在*package.json*中定义一个允许的版本范围。 **使用工作空间** 工作空间允许你用一个单源程序来管理多个项目的依赖关系。这意味着你有一个单一的、顶级的根包,它有多个子包,称为workspaces。 **远程运行脚本** *npx*命令被用来运行来自**./node_modules/.bin**的脚本。它还允许你从npm注册表中执行包,而不把它们安装在你的项目依赖中。例如,你可以通过运行以下内容创建一个新的React应用。 ``` npx create-react-app my-app ``` 在Yarn中,你可以通过使用同等的*dlx*命令来实现同样的结果。 ``` yarn dlx create-react-app my-app ``` 我们要探索的其余功能是Yarn所独有的。 **零安装** 零安装将缓存存储在你的项目目录下,在一个*.yarn*文件夹中。当你使用**yarn**或**yarn add **等命令时,Yarn将创建一个*.pnp.cjs*文件。这个文件包含了Node用来加载你的项目包的依赖层次结构。因此,你几乎可以在零时间访问它们。 **Plug'n'Play** Plug'n'Play是一种替代的安装策略。Yarn不是生成一个node_modules目录并将解决方法留给Node,而是生成一个单一的.pnp.cjs文件,将包映射到它们在磁盘上的位置和它们的依赖关系列表。这个功能可以使项目启动得更快,更好地优化依赖关系树,加快安装时间,当然也消除了对**node_modules**文件夹的需求。 **许可证** Yarn有一个内置的许可证检查器,当你开发应用程序时,它在不同的场景下都很有用。 **Yarn与npm:选择哪个软件包管理器** ----------------------- 我们已经介绍了npm和Yarn的各种异同,但我们还没有确定哪个更好,我们应该选择哪一个。与以往一样,答案取决于我们的愿望和要求。 作为一个一般性的指导,让我以下面的建议来结束。 - 如果你对目前的工作流程很满意,你不想安装一个额外的工具,而且你没有很多磁盘空间,就选择npm。 - 如果你想要一些伟大的功能,比如即插即用,你需要一些npm中缺少的功能,而且你有足够的磁盘空间,就选择Yarn。 如果你仍然觉得很难在npm和Yarn之间做出明确的决定,那么你可以看看pnpm,它试图结合两个软件包管理器的优点,是软件包管理池中的第三条大鱼。 **Yarn与npm结论** -------------- 我们已经看到了软件包管理器对现代网络开发的重要性,我们也比较了市场上最流行的两个对手。它们都有各自的优点和缺点,为了选择最适合你的,你需要对你的要求有一个清晰的认识。决定哪个更适合你的最好方法是同时尝试它们,看看哪个表现得更好。 最后,不要想太多。只需选择一个,然后进入有趣的部分:创建伟大的应用程序! [1]: http://guobacai.com/usr/uploads/2021/10/174275525.jpg [2]: http://guobacai.com/usr/uploads/2021/10/459554280.png 标签: 性能优化, npm, yarn
评论已关闭