何时在 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.json
和package.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
优于 Yarn
和 NPM
的好处
这是显示NPM
、YARN
和PNPM
安装时间的进度条(条越短越好)
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_modules
。 Yarn 还会生成一个名为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 audit
和yarn audit
都有自己的持续集成工具。它们分别是https://github.com/IBM/audit-ci(用过,效果很好!)和https://yarnpkg.com/package/audit-ci(没用过)。
【讨论】:
以上是关于何时在 NPM 上使用 Yarn?有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
yarn.lock 和 npm 的 package-lock 有啥区别?
yarn.lock 和 npm 的 shrinkwrap 有啥区别?