什么时候使用 Yarn 而不是 NPM?有什么区别?

When to use Yarn over NPM? What are the differences?

Yarn 和 NPM 有什么区别? 在写这个问题时,我只能在 Internet 上找到一些文章,这些文章展示了像 this.

这样的 NPM 命令的 Yarn 等价物

它们是否具有相同的功能(我知道 Yarn 会进行本地缓存,看起来你只需要下载一次包)但除此之外,从 NPM 迁移到 Yarn 还有什么好处吗?

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

从版本 5 开始,npm

  • 生成一个名为 package-lock.json 的 'lockfile' 修复整个依赖关系树,就像纱线(或任何其他)锁定机制一样,
  • 制作了一个工具
  • --save 现在隐含在 npm i
  • 更好的网络和缓存使用

npm 5.7.0 further introduced npm ci 命令在持续集成环境中通过只安装在 package-lock.json 中找到的包来更快地安装依赖项(如果 package-lock.jsonpackage.json 不同步)。

个人,我还是用npm


原创

我不愿意直接引用文档,但他们很好解释了原因,简明扼要,我看不出如何进一步总结这些想法。

大部分:

  1. 你总是知道你在每一次发展中都得到了同样的东西 机器

  2. 它并行化了 npm 没有的操作,

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

  4. 它也可能使更有效率。

人们使用它的生产经验是什么?谁知是将军的宝贝public.

TL;DR from Yehuda Katz:

From the get-go, the Yarn lockfile guarantees that repeatedly running yarn on the same repository results in the same packages.

Second, Yarn attempts to have good performance, with a cold cache, but especially with a warm cache.

Finally, Yarn makes security a core value.

不错的博客post

甘特·拉博德的“NPM vs Yarn Cheat Sheet

稍长的版本from the project

Fast: Yarn caches every package it downloads so it never needs to again. It also parallelizes operations to maximize resource utilization so install times are faster than ever.

Reliable: Using a detailed, but concise, lockfile format, and a deterministic algorithm for installs, Yarn is able to guarantee that an install that worked on one system will work exactly the same way on any other system.

Secure: Yarn uses checksums to verify the integrity of every installed package before its code is executed.

来自 the README.md:

  • Offline Mode: If you've installed a package before, you can install it again without any internet connection.
  • Deterministic: The same dependencies will be installed the same exact way across every machine regardless of install order.
  • Network Performance: Yarn efficiently queues up requests and avoids request waterfalls in order to maximize network utilization.
  • Multiple Registries: Install any package from either npm or Bower and keep your package workflow the same.
  • Network Resilience: A single request failing won't cause an install to fail. Requests are retried upon failure.
  • Flat Mode: Resolve mismatching versions of dependencies to a single version to avoid creating duplicates.
  • More emojis.

当您使用 Yarn 安装包时(使用 yarn add packagename),它 将包放在您的磁盘上 。在下一次安装期间,将使用此包而不是发送 HTTP 请求以从注册表中获取 tarball。

Yarn 带有一个方便的许可证检查器,如果您必须检查您依赖的所有模块的许可证,它会变得非常强大。

如果您正在使用专有软件,那么使用哪一个并不重要。使用 npm,您可以使用 npm-shrinkwrap.js,而您可以使用 yarn.lock 和 Yarn。

更多信息请阅读以下博客

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

什么是 PNPM?

pnpm 使用 hard links 和 symlinks 在磁盘上只保存一个模块的一个版本。例如,当使用 npm 或 Yarn 时,如果您有 100 个项目使用相同版本的 lodash,则磁盘上将有 100 个 lodash 副本。使用 pnpm,lodash 将保存在磁盘上的一个单独位置,并且硬盘 link 会将其放入应该安装的 node_modules 中。

因此,您可以在磁盘上节省数 GB 的 space 并且安装速度更快!如果您想了解有关 pnpm 创建的独特 node_modules 结构的更多详细信息,以及为什么它在 Node.js 生态系统中运行良好,请阅读这篇小文章:Why should we use pnpm?

如何安装 PNPM?

npm install -g pnpm

如何使用 PNPM 安装 npm 包?

pnpm install -g typescript // or your desired package

PNPM 优于 YarnNPM

的优势

这是显示 NPMYARNPNPM 安装时间的进度条(进度条越短越好)

Click for Complete check Benchmark

有关详细信息,请访问 https://www.npmjs.com/package/pnpm

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

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

npm init

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

然后

npm install

将创建一个目录 node_modules 并在其中下载依赖项(您添加到 package.json 文件中)。

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

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

为了解决这些问题和其他问题,Facebook introduced a new package manager (2016):Yarn 更快、更安全、更可靠 JavaScript.

的包管理器

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

yarn init

这将创建一个 package.json 文件。然后,安装依赖项:

yarn install

将生成一个文件夹node_modulesYarn 也会生成一个名为 yarn.lock 的文件。此文件的用途与 package-lock.json 相同,但使用确定性和可靠的算法构建,从而实现一致的构建。

如果您使用 npm 启动了一个项目,您实际上可以轻松迁移到 Yarn。纱线将消耗相同的 package.json。有关详细信息,请参阅 Migrating from npm

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

npm:

  1. JavaScript 的包管理器。 npm 是命令行 npm 生态系统的接口。令人惊讶的是,它经过了实战考验 灵活,被数十万 JavaScript 开发人员使用 每一天。
  2. NPM 生成正确的锁定文件,而 Yarn 锁定文件可能是 在某些情况下会损坏,必须使用 yarn-tools
  3. 修复

纱线:

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

@msanford 的回答几乎涵盖了所有内容,但是,我遗漏了安全性(OWASP 的已知漏洞)部分。

纱线

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

npm

您可以使用npm audit fix,所以其中一些您可以自己修复。

他们两个,即 npm audityarn audit 都有自己的持续集成工具。这些分别是https://github.com/IBM/audit-ci (used, works great!) and https://yarnpkg.com/package/audit-ci(没用过)