何时使用Yarn而不是NPM?它们有什么区别?

203

什么是Yarn和NPM之间的区别? 在撰写这个问题时,我只能在互联网上找到一些文章,展示了Yarn命令的等效NPM命令。

它们是否具有相同的功能(我知道Yarn可以进行本地缓存,看起来只需要下载一次包),但除此之外,从NPM转移到Yarn是否有任何好处?


23
这并不是一个糟糕的问题,也不应该被点踩。但是,它需要稍微加以完善才能成为一个真正好的问题。 - user677526
快速谷歌搜索出现了这个。我认为这可能对于StackOverflow来说太宽泛/不具建设性,并且需要展示更多的研究。 - Aurora0001
3
当我搜索时,我看到了备忘单,但那并不是我问题的答案!我想知道两者之间的区别,而不是命令之间的区别。请先阅读我的问题。 - Asha
5
@Asha 你应该编辑你的问题,提供更多具体细节,并展示你已经做过的研究工作。你想要找到哪些方面的差异?你是试图了解这些库是如何实现的吗?还是你是试图找出它们在解决问题时的不同之处?如果你让你的问题更加明确,那会很好,取决于你所问的内容。(根据你所问的问题,这些信息可能已经可以在谷歌上找到了。) - user677526
@Asha,如果你表明你已经阅读过那篇文章但它并不相关,那么展示研究努力会很有帮助。不过,正如我所说,比较问题通常不适合问答,如果你用不同的方式提出问题可能会更好。 - Aurora0001
这是一个很好的问题。 - carloswm85
8个回答

97

更新:2018年3月(有点晚了...)

自从版本5以来,npm

  • 生成一个名为package-lock.json的“锁定文件”,与yarn(或任何其他)锁定机制类似,可以修复您的整个依赖树,
  • 已经制作了一个工具,
  • --save现在被隐含在npm i中,
  • 更好的网络和缓存使用。

npm 5.7.0 进一步引入npm ci命令,通过仅安装package-lock.json中找到的软件包(如果package-lock.jsonpackage.json不同步,则报告错误),可以更快地在持续集成环境中安装依赖项。

个人而言,我仍然使用npm


原文

我不太愿意直接引用文档,但它们确实很好地解释了为什么,足够简洁,以至于我不知道如何进一步概括这些想法。

主要有:

  1. 在每台开发机器上,您始终知道正在获取相同的东西

  2. 它并行执行npm无法执行的操作,以及

  3. 它更有效地利用网络。

  4. 它还可以更有效地使用其他系统资源(例如RAM)

人们对此的生产经验是什么?谁知道,它对大众来说还是个婴儿。

TL;DR 来自Yehuda Katz

请注意,以上内容已经被翻译成中文。
从一开始,Yarn的锁文件保证了在同一代码库上反复运行yarn会得到相同的软件包。
其次,Yarn力求在冷缓存和热缓存下都有良好的性能表现。
最后,Yarn将安全性作为核心价值观。
很棒的博客文章:“NPM vs Yarn Cheat Sheet”作者是Gant Laborde。
稍微长一点的版本可以从项目链接中找到。
快速:Yarn缓存它下载的每个软件包,因此不需要再次下载。它还并行执行操作以最大化资源利用率,因此安装时间比以往更快。
可靠:使用详细但简洁的锁定文件格式和确定性安装算法,Yarn能够保证在一个系统上工作的安装在任何其他系统上都会以完全相同的方式工作。
安全:Yarn使用校验和来验证每个已安装软件包的完整性,然后才执行其代码。

来自README.md

离线模式:如果您之前已经安装过一个软件包,您可以在没有任何互联网连接的情况下再次安装它。
确定性:无论安装顺序如何,相同的依赖关系都将以完全相同的方式安装在每台计算机上。
网络性能:Yarn有效地排队请求并避免请求瀑布,以最大化网络利用率。
多个注册表:从npm或Bower安装任何软件包,并保持软件包工作流程不变。
网络弹性:单个请求失败不会导致安装失败。失败的请求将被重试。
平面模式:将不匹配版本的依赖项解析为单个版本,以避免创建重复项。
更多表情符号。

你能告诉我yarn是否像npm v3一样进行依赖关系解析吗?我知道有一个--flat选项,它强制使用真正的平面结构,只允许安装每个依赖项的一个版本,但默认行为是什么?谢谢。 - Dimitris Karagiannis
8
很棒的回答。我想知道在复制、重命名和更改“install -g”的语法之前,他们是否尝试过向npm做出贡献。 - Gardner Bickford
非常好的文章 https://scotch.io/tutorials/yarn-package-manager-an-improvement-over-npm - Akshay Vijay Jain

9

为初学者提供更好的概述。

npm 是JavaScript历史上(2010年)最受欢迎的包管理器。如果你想使用它来管理项目的依赖项,你可以输入以下命令:

npm init

这将生成一个package.json文件,其中包含项目的所有依赖项。

然后,
npm install

会创建一个名为node_modules的文件夹,并下载里面添加到package.json文件中的依赖项。

还将创建一个package-lock.json文件。该文件用于描述生成的依赖树。它允许开发人员安装完全相同的依赖项。例如,您可以想象一个开发人员将依赖项升级到v2,然后再升级到v3,而另一个开发人员直接升级到v3。

npm以非确定性方式安装依赖项,这意味着两个开发人员可能有不同的node_modules目录,导致行为不同。 **例如,在2018年2月,版本5.7.0中发现了一个问题:在Linux系统上运行sudo npm将更改系统文件的所有权,从而永久破坏操作系统。

为了解决这些问题等其他问题,Facebook推出了一个新的包管理器(2016):Yarn,一个更快、更安全和更可靠的JavaScript包管理器。

您可以通过键入以下内容将Yarn添加到项目中:

yarn init

这将创建一个package.json文件。然后,使用以下命令安装依赖项:

yarn install

将生成一个名为node_modules的文件夹。 Yarn还将生成一个名为yarn.lock的文件。此文件与package-lock.json具有相同的目的,但是使用确定性和可靠的算法构建,从而导致一致的构建。

如果您使用npm启动了项目,实际上可以轻松迁移到Yarn。yarn将使用相同的package.json。有关更多详细信息,请参见从npm迁移

但是,npm在每个新版本中都得到改进,某些项目仍然使用npm而不是yarn


8

什么是PNPM?

pnpm使用硬链接和符号链接,在磁盘上只保存一个模块的一个版本。例如,如果您有100个项目都使用相同版本的lodash,使用npm或Yarn等工具,您将在磁盘上拥有100个lodash的副本。而使用pnpm,lodash将只保存在磁盘上的一个位置,并且通过硬链接放置到应该安装它的node_modules中。

因此,您可以节省磁盘空间并实现更快速的安装!如果您想了解有关pnpm创建的独特node_modules结构以及为什么它可以很好地与Node.js生态系统配合使用的更多详细信息,请阅读这篇小文章:为什么我们应该使用pnpm?

如何安装PNPM?

npm install -g pnpm

如何使用PNPM安装npm包?
pnpm install -g typescript // or your desired package

PNPM相较于YarnNPM的优势

这里有一个进度条,显示NPMYARNPNPM的安装时间(更短的条形图更好) enter image description here

点击查看完整的基准测试结果

欲了解更多详情,请访问https://www.npmjs.com/package/pnpm


2
问题是关于 NPM 和 Yarn。 - ErinsMatthew

6

@msanford的答案几乎涵盖了所有内容,但我想补充一下安全性(OWASP已知漏洞)部分。

Yarn

您可以使用yarn audit检查它们,但您无法修复它们。这仍然是GitHub上的一个未解决问题(https://github.com/yarnpkg/yarn/issues/7075)。

npm

您可以使用npm audit fix修复其中的一些漏洞。

这两个工具,即npm audityarn audit都有自己的持续集成工具。它们分别是https://github.com/IBM/audit-ci(已使用,效果很好!)和https://yarnpkg.com/package/audit-ci(未使用)。


5

npm:

  1. npm是JavaScript的软件包管理器。它是npm生态系统的命令行界面。它经过了大量测试,非常灵活,并且每天都有数十万名JavaScript开发人员使用。
  2. NPM生成正确的锁定文件,而Yarn锁定文件在某些情况下可能会损坏,需要使用yarn-tools修复。

Yarn:

  1. Yarn是JavaScript的新软件包管理器。Yarn缓存每个下载的软件包,因此不再需要重新下载。它还并行化操作以最大化资源利用率,因此安装时间比以往更快。
  2. Yarn不支持使用密码登录(而NPM支持)。

6
什么样的登录? - Rich Steinmetz

3
当您使用Yarn(使用yarn add packagename)安装软件包时,它会在您的磁盘上放置该软件包。在下一次安装时,将使用此软件包,而不是发送HTTP请求以从注册表获取tarball。
Yarn附带一个方便的许可证检查器,在必须检查所依赖的所有模块的许可证的情况下,它可以变得非常强大。
如果您正在开发专有软件,则使用哪个并不重要。对于npm,您可以使用npm-shrinkwrap.js,而对于Yarn,您可以使用yarn.lock。
有关更多信息,请阅读以下博客。

https://blog.risingstack.com/yarn-vs-npm-node-js-package-managers/


1
Yarn
优点:
- 支持并行安装和零安装等功能,提高性能 - 更加安全 - 拥有庞大的活跃用户社区
缺点:
- 不支持 Node.js 的旧版本(低于 5) - 安装本地模块存在问题
NPM
优点:
- 易于使用,特别是对于使用旧版本的开发人员来说 - 优化本地包安装,节省硬盘空间
缺点:
- 仍然存在安全漏洞
结论:
Yarn 是否比 NPM 更好?

就速度和性能而言,Yarn比NPM更好,因为它可以执行并行安装。Yarn仍然比NPM更安全。但是,Yarn使用的磁盘空间比NPM多。


0
自从版本4以来,Yarn已经包含了一个命令yarn upgrade-interactive。以前需要手动安装,但现在这个核心插件已经内置了。它有一个很棒的CLI界面,可以让您选择更新版本,可能升级到依赖项的新主要版本。在npm中,没有这样的命令。最接近的NPM等效命令第三方包npm-check-updates,需要手动安装。 NPM有 npm link 命令,实际上是有效的。它允许您将本地包(通常是库)“安装”到其他使用它的本地项目中进行测试。众所周知,这个命令在yarn中存在问题或无法工作。
Yarn的另一个优点是出色的工作区管理工具,使其甚至可以与lerna相媲美,但自从版本8以来,npm甚至也具有可用的工作区实用工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接