何时在 NPM 上使用 Yarn?有啥区别?

Posted

技术标签:

【中文标题】何时在 NPM 上使用 Yarn?有啥区别?【英文标题】:When to use Yarn over NPM? What are the differences?何时在 NPM 上使用 Yarn?有什么区别? 【发布时间】:2017-02-22 23:31:25 【问题描述】:

Yarn 和 NPM 有什么区别? 在写这个问题的时候,我只能在互联网上找到一些文章,显示像 this 这样的 NPM 命令的 Yarn 等价物是什么。

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

【问题讨论】:

这是一个不错的问题,不值得一票否决。也就是说,它确实需要充实一点才能使它成为一个真正的好问题。 快速谷歌出现this。我相信这可能是 *** 的 too broad/not constructive 并且无论如何都可以进行更多研究。 @Aurora0001 当我搜索时,我看到了备忘单,但这不是我问题的答案!我想知道两者之间的差异,而不是命令之间的差异。请先阅读我的问题 @Asha 您应该编辑您的问题以获得更多细节,并展示您已经研究过的内容。您希望找到什么样的差异?您是否试图找出这些库是如何实现的?您是否试图找出他们在解决问题方面的不同之处?如果你让你的问题更精确,它可能会很好,这取决于你问什么。 (根据您的要求,这些信息可能已经在 Google 上提供。) 有趣的人告诉你谷歌它;我发现你的问题要通过谷歌搜索...*** 中的人喜欢过度排除事物,好像这会让它们变得更重要,我猜。 【参考方案1】:

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

从第 5 版开始,npm

生成一个名为package-lock.json 的“锁定文件”,它可以像纱线(或任何其他)锁定机制一样修复整个依赖树, 制作了一个工具 --save 现在隐含在 npm i 中 更好的网络和缓存使用率

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

个人,我还是用npm


原创

我不喜欢直接从文档中引用,但他们在解释原因方面做得很好,简洁到我看不出如何进一步总结这些想法。

大部分:

    你总是知道你在每次开发中都得到了相同的东西 机器

    它并行化 npm 没有的操作,并且

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

    use of other system resources (such as RAM) 也可以提高效率。

人们对它的生产经验是什么?谁知道呢,对普通大众来说就是个婴儿。

TL;DR from Yehuda Katz:

从一开始,Yarn 锁文件就保证了重复运行 相同存储库中的 yarn 会产生相同的包。

其次,Yarn 尝试有良好的性能,使用冷缓存,但是 尤其是暖缓存。

最后,Yarn 让安全成为核心价值。

不错的博文

Gant Laborde 的“NPM vs Yarn Cheat Sheet”

稍长的版本from the project:

快速:Yarn 缓存它下载的每个包,因此它永远不需要 再次。它还并行化操作以最大化资源 利用率,因此安装时间比以往任何时候都快。

可靠:使用详细但简洁的锁定文件格式,以及 安装的确定性算法,Yarn 能够保证 在一个系统上运行的安装将以完全相同的方式运行 任何其他系统。

安全:Yarn 使用校验和来验证每个安装的完整性 在其代码执行之前打包。

来自the README.md:

离线模式:如果您之前安装过一个包,您可以在没有任何互联网连接的情况下再次安装它。 确定性:无论安装顺序如何,相同的依赖项都将以完全相同的方式安装在每台计算机上。 网络性能:Yarn 有效地将请求排队并避免请求瀑布,以最大限度地提高网络利用率。 多个注册表:从 npm 或 Bower 安装任何包,并保持包工作流相同。 网络弹性:单个请求失败不会导致安装失败。请求会在失败时重试。 平面模式:将不匹配的依赖版本解决为单个版本,以避免创建重复。 更多表情符号。 ?

【讨论】:

你能告诉我 yarn 是否进行依赖解析 like npm v3 does 吗?我知道有一个 --flat 选项强制使用 real 平面结构,其中每个依赖项只允许安装一个版本,但默认行为是什么?谢谢。 更多表情符号:cat: 优秀的答案。我想知道他们是否尝试在分叉、重命名和更改 install -g 的语法之前为 npm 做出贡献。 非常好的帖子scotch.io/tutorials/…【参考方案2】:

当您使用 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/

【讨论】:

【参考方案3】:

什么是 PNPM?

pnpm 使用硬链接和符号链接在磁盘上只保存一次模块的一个版本。例如,当使用 npm 或 Yarn 时,如果您有 100 个项目使用相同版本的 lodash,那么磁盘上将有 100 个 lodash 副本。使用 pnpm,lodash 将被保存在磁盘上的一个位置,并且硬链接会将其放入应该安装它的 node_modules 中。

因此,您节省了数千兆字节的磁盘空间,并且安装速度大大加快!如果您想了解有关 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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

npm

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

纱线

    一个新的 JavaScript 包管理器。 Yarn 缓存它的每个包 下载所以它永远不需要再次。它还并行化 最大限度地利用资源的操作,因此安装时间 比以往更快。 Yarn 不支持使用密码登录(而 NPM 支持)

【讨论】:

什么样的登录方式?【参考方案6】:

@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(用过,效果很好!)和https://yarnpkg.com/package/audit-ci(没用过)。

【讨论】:

以上是关于何时在 NPM 上使用 Yarn?有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

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

yarn.lock 和 npm 的 shrinkwrap 有啥区别?

`yarn link` 和 `npm link` 有啥区别?

yarn run 和 npm start 有啥区别?

在同一个项目中使用 NPM 和 Yarn 有啥坏处吗?

npm install 中的 --save 和 --save-dev 有啥区别?