yarn.lock 和 npm 的 package-lock 有什么区别?

What is the difference between yarn.lock and npm's package-lock?

我在一个使用 Yarn 的项目中不小心 运行 npm install 并注意到 npm 创建了一个 package-lock.json 文件。

我知道 Yarn 的流行部分是因为它使用了一个锁文件来产生比 npm 更可靠和确定的依赖安装,npm 有一段时间只有一个残废 shrinkwrap feature,但现在我不是确定这个 npm lockfile 业务是做什么的,以及继续使用 Yarn 是否有任何令人信服的地方。

所以本着 的精神,我提出以下问题:

在理论上,Yarn 和 NPM 5 看起来几乎相同。它们都有确定性的锁定文件,并且在功能上几乎相互匹配。有人会说 Yarn 是推动 NPM 创新的催化剂。

然而,在体验了一个月的 NPM 5 之后,我的团队决定转向 Yarn。

NPM 在技术上有一个 "more deterministic" 锁定文件,理论上可以保证跨 NPM 版本,NPM 将生成完全相同的 node_modules 文件夹。另一方面,Yarn 的确切 hoisting/ordering 依赖关系取决于 Yarn 版本,并且可能会在 Yarn 版本之间发生变化。一般来说,这个影响很小。

那为什么要用 Yarn?合并和可靠性。

Yarn 做出了轻微的确定性权衡,以实现更简单的 yarn.lock 文件,更容易合并。如果你是一个单独的开发者,这可能不会影响你,但如果你在一个有多个协作者提交依赖项更改的团队中,它很快就会成为一个大问题。 NPM 的 package-lock 实际上是不可合并的,你最终不得不重新生成或挣扎。另一方面,使用 Yarn,合并变得简单且可预测。

参见:https://yarnpkg.com/blog/2017/05/31/determinism/

附带说明一下,我们还发现 Yarn 平均而言更可靠。