yarn 和 npm 之间的主要区别是什么?

What is main difference between yarn and npm?

我想问一下你最喜欢的 JS 包管理器是什么? 我看到一些关于 yarn 和 npm 的文章。但我不确定什么对我来说更好。我刚开始学JS。

现在 yarn 和 npm 之间的区别对我来说就像不同品牌的可乐之间的区别。

有时我们只有 npm,但它在解决依赖项和缓存方面存在很多问题,以至于诞生了另一个工具 (yarn)。通常它使用本地缓存来解决依赖关系,这很重要,例如 运行ning CI 作业几乎总是 运行 在相同的环境中,高带宽是昂贵的,因为您需要为数据付费在云服务中。这意味着在旧的 npm 版本中,当你 运行 npm install 并且你让 deps

第一个笔记

请理解 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

想象一下当 another_module 的维护者决定将 lodash 升级到重大更改版本 1.2.0 时可能发生的情况是 npm 在过去可以获取同一库的 2 个不同实例,和 2 个不同的版本,这可能会导致极其奇怪的行为。因为你的模块没有精确锁定(你接受任何 semver 版本 ^1.x.x 和 ^2.x.x 所以这意味着两个子模块都会满足你的要求但获取不同的版本。纱线会锁定你的yarn.lock 在向项目添加新包时,这意味着当您项目中的其他开发人员将签出该项目时,他也将拥有相同的 yarn.lock 并且 yarn 最终将 "mimic" 当你提交 yarn.lock 时它们是如何安装的状态 NPM 只是为了满足 semver 的要求,并且可以为 2 个开发人员获取 2 个不同的版本(假设包及时升级)

最后的笔记

npm 人在发布 npm@5 时做了很多工作,我认为现在所有的陈述都只是创建 yarn 的原因以及它正在解决的问题当时,但我认为目前这两者之间没有太大区别