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
的原因以及它正在解决的问题当时,但我认为目前这两者之间没有太大区别
我想问一下你最喜欢的 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
版本锁定
如前所述,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
的原因以及它正在解决的问题当时,但我认为目前这两者之间没有太大区别