Yarn和npm有什么主要区别?

59

我想问一下,你最喜欢用的JS包管理器是什么? 我看过一些有关yarn和npm的文章,但我不确定哪一个更适合我。我刚开始学习JS。

目前来说,yarn和npm的区别对我来说就像可乐品牌之间的区别。


3
我看到了一些文章...但是这些文章的日期非常不同...所以我在这里询问有关yarn和npm用户实际信息的原因就在于此。 - user9772177
1个回答

72
曾经我们只有npm,但是它在解决依赖和缓存方面存在很多问题,因此出现了另一个工具(yarn)。通常情况下,它使用本地缓存来解决依赖关系,在运行CI作业时非常重要,因为几乎总是在相同的环境中运行,而高带宽成本昂贵,因为你需要支付云服务中的数据。这意味着在旧的npm版本中,当你运行npm install并且在deps中有lets时。

第一条注意事项

请理解yarn是建立在npm包和https://www.npmjs.com/之上的,这意味着它们都使用NPM注册表来解决包。因此,如果你运行npm install lodash@1.0.0.或者yarn add lodash@1.0.0.,你将得到非常相似的结果。

增量安装

react@16.0.0

每次构建时,都会从互联网上重新下载依赖项。Yarn在底层使用yarn.lock,并将您的package.json文件与yarn.lock进行比较,确定需要获取哪些包以仅增量安装新依赖项。
多线程
yarn提供了非依赖线程的并行安装包功能。它可以将安装时间降低到npm install的1/10。
版本锁定
正如之前所述,yarn在每次安装后生成yarn.lock,其中包含所有已安装软件包的版本(一个软件包可以有依赖项,而依赖项也可能有自己的依赖项),因此它可以建立无限的依赖树,这可能会导致非常严重的冲突。让我们想象一下这种情况。
 - lodash^1
 - super_module@0.0.1
 - - lodash@1.0.0
 - another_module@0.0.01
 - - lodash@1.x.x

想象一下这样的情况,另一个模块的维护者决定将lodash升级到破坏性更改版本1.2.0,可能发生的情况是,旧版的npm可以获取同一库的两个不同实例和不同版本,这可能会导致极其奇怪的行为。因为在您的模块中没有确切的锁定(您接受任何semver版本^1.x.x和^2.x.x,因此这意味着两个子模块都将满足您的要求但获取不同版本)。Yarn将在向项目添加新包时锁定您的yarn.lock,这意味着当其他开发人员检查该项目时,他也将具有相同的yarn.lock,并且yarn最终将“模仿”打包状态在您提交yarn.lock时安装的状态,而NPM只查看semver满足度并且可以为两个开发人员获取2个不同的版本(假设在此期间打包正在升级)。
最后说明:npm发布了npm@5以来已经做了很多工作,我认为所有声明现在只是解释为什么创建yarn以及它解决了哪些问题,但我认为在当前日期,目前这两者之间没有太大区别。

4
我几天前在其他地方回答了类似的问题,这只是个巧合,我没有从任何地方抄袭 :) - Milos Mosovsky
1
@epascarello 是的,没错,就是这样....这并不意味着当某人拥有14万声望时,其他人就必须为了+15声望而创建一个帐户....您可以比较帐户的ISP或查看我的个人资料...如果我的答案不合法....那太可笑了。请再次阅读https://stackoverflow.blog/2018/04/26/stack-overflow-isnt-very-welcoming-its-time-for-that-to-change/,并重新考虑一下您刚才在评论中所问的问题。谢谢 - Milos Mosovsky
我认为Stack Overflow并不是一个那么敌对的环境,但还是谢谢你的回答:D 最后说明帮了我很多。 - user9772177
1
npm:JavaScript的包管理器。npm是npm生态系统的命令行界面。它经过了实战考验,非常灵活,并且每天被数十万JavaScript开发人员使用。Yarn:JavaScript的新包管理器。Yarn缓存其下载的每个软件包,因此永远不需要再次下载。它还并行执行操作以最大化资源利用率,因此安装时间比以往更快。 - Yogesh Waghmare
我想知道Webpack在Yarn和NPM中的位置... - Qasim

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