Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。就像我们可以从官方文档了解那样,它的目的是解决这些团队使用 npm 面临的少数问题,即:

  • 安装的时候无法保证速度/一致性
  • 安全问题,因为 npm 安装时允许运行代码

但请不要惊慌!它并没有试图完全取代 npm。Yarn 同样是一个从 npm 注册源获取模块的新的 CLI 客户端。注册的方式不会有任何变化 —— 你同样可以正常获取与发布包。

是否每个人现在都要跳上 Yarn 这辆被大肆宣传的列车?又或者你根本没机会碰到 npm 的这些问题。本篇文章将会比较 npm 与 Yarn,最终你可以决定哪款更适合你。

Yarn vs npm: 功能差异

乍一看 Yarn 与 npm 很类似,但通过引擎的对比就能察觉 Yarn 的不同。

yarn.lock 文件

npm 和 Yarn 都使用 package.json 来跟踪项目的依赖,版本号并非一直准确,因为你可以定义版本号范围,这样你可以选择一个主版本和次要版本的包,但让 npm 安装最新的补丁也许可以修改一些 bug。

理想状态下使用语义化版本发布补丁不会包含大的变化,但不幸的是这必非真理。npm 的这种策略可能导致两台拥有相同 package.json 文件的机子安装了不同版本的包,这可能导致一些错误。

为了避免包版本的错误匹配,一个确定的安装版本被固定在一个锁文件中。每次模块被添加时,Yarn 就会创建(或更新)yarn.lock 文件,这样你就可以保证其它机子也安装相同版本的包,同时包含了 package.json 中定义的一系列允许的版本。

在 npm 中同样可以使用 npm shrinkwrap 命令来生成一个锁文件,这样在使用 npm install 时会在读取 package.json 前先读取这个文件,就像 Yarn 会先读取yarn.lock 一样。这里的区别是 Yarn 总会自动更新 yarn.lock,而 npm 需要你重新操作。

  1. yarn.lock 文档
  2. npm shrinkwrap 文档

并行安装

每当 npm 或 Yarn 需要安装一个包时,它会进行一系列的任务。在 npm 中这些任务是按包的顺序一个个执行,这意味着必须等待上一个包被完整安装才会进入下一个;Yarn 则并行的执行这些任务,提高了性能。

为了比较,我在没有使用 shrinkwrap/yarn.lock 的方式以及清理了缓存下使用 npm 与 Yarn 安装 express,总共安装了 42 个依赖。

  • npm: 9 s
  • Yarn: 1.37 s

我无法相信自己的眼睛,所以重复以上步骤,但得到相同结果。接着我安装 gulp 进行测试,总共安装了 195 个依赖。

  • npm: 11 s
  • Yarn: 7.81 s

似乎根据所需要安装的包的数量而有所不同,但 Yarn 依旧比较快。

清晰的输出

npm 默认情况下非常冗余,例如使用 npm install 时它会递归列出所有安装的信息;而 Yarn 则一点也不冗余,当可以使用其它命令时,它适当的使用 emojis 表情来减少信息(Windows 除外)。

Yarn vs npm: CLI 的差异

除了一些功能差异,Yarn 命令也存在一些区别。例如移除或修改了一些 npm 命令以及添加了几个有趣的命令。

yarn global

不像 npm 添加 -g 或 --global 可以进行全局安装,Yarn 使用的是 global 前缀。不过与 npm 类似,项目依赖不推荐全局安装。

global 前缀只能用于 yarn addyarn binyarn ls 和 yarn remove,除yarn add外,这些命令都和 npm 等效。

  1. yarn global 文档

yarn install

npm install 命令会根据 package.json 安装依赖以及允许你添加新的模块;yarn install 仅会按 yarn.lock 或 package.json 里面的依赖顺序来安装模块。

  1. yarn install 文档
  2. npm install 文档

yarn add [–dev]

与 npm install 类似,yarn add 允许你添加与安装模块,就像命令的名称一样,添加依赖意味着也会算定将依赖写入 package.json,类似 npm 的 --save 参数;Yarn 的 --dev参数则是添加开发依赖,类似 npm 的 --save-dev 参数。

  1. yarn add 文档
  2. npm install 文档

yarn licenses [ls|generate-disclaimer]

npm 没有类似命令来方便编写自己的包。yarn licenses ls 列出所有已安装包的许可协议。yarn licenses generate-disclaimer 生成包含已安装包许可协议的免责声明。某些协议要求使用者必须在项目中包含该协议,这时候该命令将变得非常好用。

  1. yarn licenses 文档

yarn why

该命令会查找依赖关系并找出为什么会将某些包安装在你的项目中。也许你明确为什么添加,也许它只是你安装包中的一个依赖,yarn why 可以帮你弄找出。

  1. yarn why 文档

yarn upgrade

该命令会根据符合 package.json 设定的规则而不是 yarn.lock 定义的确切版本来将包更新到最新版本。如果想用 npm 来实现相同目的,可以这样执行:

 
 
 
 
 

Shell

 
1
2
rm -rf node_modules
npm install

不要将该命令与 npm update 混淆,它指的是更新到自己的最新版。

  1. yarn upgrade 文档

yarn generate-lock-entry

yarn generate-lock-entry 会基于 package.json 设置的依赖生成 yarn.lock 文件,该命令与 npm shrinkwrap 类似,但应该小心使用,因为通过 yarn add 和 yarn upgrade 命令添加或更新依赖时会自动更新生成该锁文件。

  1. yarn generate-lock-entry 文档
  2. npm shrinkwrap 文档

稳定性与可靠性

Yarn 被炒得这么火热会不会有问题?它正式发布当天就收到很多问题反馈,但官方处理问题的速度极快。这些表明社区正努力开发并修复bug。查看问题反馈的数量和类型可以发现 Yarn 在大多数用户的机子上表现的很稳定,但可能个别机子会有问题。

请注意虽然一个包管理器可能对你的项目非常重要,但它仅仅只是个工具,如果出了状况,恢复包不会困难,也并非要回归 npm。

未来

也许你了解 Node.js 与 io.js 之间的历史。简单来说:io.js 是 Node.js 一些核心开发者因为项目管理上的分歧而独立出来创建的分支。不同的是,io.js 选择了开放式管理,在不到一年的时间时,两支团队达成协议,io.js 被合并回 Node.js,无论对错,它为 Node.js 带来了相当多不错的功能。

我看到 npm 与 Yarn 和它们有着类似的模式,不过 Yarn 不是分支,它解决了 npm 的一些缺陷。如果 npm 从中学到东西并邀请 Facebook,Google 或其它 Yarn 的贡献者们来一起提升 npm 不是很酷吗?虽然言之过早,但我期待它会发生。

无论哪种结果,Yarn 前途一片光明。社区得到别人对新工具的赞扬后似乎很兴奋,不幸的是,社区并没有提供路线图,所以我不确定 Yarn 是否为我们准备了其它惊喜。

结论

相比 npm 的默认配置,Yarn 获得不少赞同。我们可以方便生成锁文件,安装包时非常迅速并且他们会自动添加进 package.json,同时安装与使用 Yarn 的影响也很小,你可以直接在一个项目上尝试看它是否可以工作,这使得 Yarn 可以完美替代 npm。

我绝对推荐在一个项目中尽早使用 Yarn,如果你对安装和使用新软件持谨慎态度,可以等待几个月。毕竟 npm 久经考验,它在软件开发领域也有存在的价值。

使用你正确等待 npm 完成包的安装,也许这是阅读迁移指南的最佳时刻 ;)

你怎么想呢?你是否已经在使用 Yarn?你是否将要尝试?或者这只是一个已经支离破碎的生态系统的进一步破碎?请在下面评论区留下你的观点。

Yarn vs npm: 你需要知道的一切的更多相关文章

  1. node的包管理工具:yarn和npm

    arn是Facebook发布的一款依赖管理工具,它比npm更快.更高效. NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题. 一.yarn官方网站: 英文官网:ht ...

  2. 了解 yarn 、npm、nodejs

    一.前言 针对即将上线的 jeecg-boot 做一些准备.   二.了解系列 1.了解 nodejs Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrom ...

  3. Yarn vs npm: 你需要知道的一切(转)

    英文原文:https://www.sitepoint.com/yarn-vs-npm/ 译文:http://web.jobbole.com/88459/ Yarn 是 Facebook, Google ...

  4. [web前端] yarn和npm命令使用

    原文地址: https://blog.csdn.net/mjzhang1993/article/details/70092902/ 最初接触 yarn 还是在 0.17.10 版本,由于各种各样的原因 ...

  5. Yarn 和 Npm 命令行切换 摘录

    原文作者: @Gant Laborde原文地址: https://shift.infinite.red/np...中文翻译: @文蔺译文地址:http://www.wemlion.com/2016/n ...

  6. Yarn vs npm:你需要知道的一切(转)

    转载:https://zhuanlan.zhihu.com/p/23493436 原文链接:Yarn vs npm: Everything You Need to Know Facebook.Goog ...

  7. 解决Homestead yarn , npm run dev, 命令报错问题!

    解决Homestead yarn , npm run dev, 命令报错问题! 2018年06月01日 11:50:51 偶尔发发颠 阅读数:1654    版权声明:本文为博主原创,未经博主同意,不 ...

  8. 用yarn替代npm

    最近,从npm拉取vue-cli总失败,后来干脆直接用yarn 全局安装yarn(官网首推用系统包安装,更加安全) npm i yarn -g 用yarn添加全局vue-cli yarn global ...

  9. yarn和npm的对比以及yarn的使用

    0--前言 为什么要使用yarn,如果你从事前端开发有些年头了,那你肯定对npm又爱又恨,爱就不说了,恨嘛,就是NPM经常奇慢和卡顿,这还能忍,经常各种错误就没法忍了,尤其是他人创建的项目,自己在安装 ...

随机推荐

  1. 使用二进制安装包的方式单机部署MySQL8.0.13

    使用二进制安装包的方式单机部署MySQL8.0.13 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于MySQL的介绍我这里就不多做赘述了,如何下载MySQL详情请参考:MySQ ...

  2. 搭建Hadoop集群(生产环境)

    1.搭建之前:百度copy一下介绍 (本博客几乎全都是生产环境的配置..包括mongo等hbase其他) Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层 ...

  3. C++回顾day01---<命名空间>

    一:namespace是指标识符的各种控件范围(类java中package) C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace 二:iostr ...

  4. testlink for windows 安装

    testlink的使用说明可到官网查看:http://www.testlink.org.cn/509.html 一.安装xampp 到xampp官网中下载安装文件,按步骤安装即可. 二.Testlin ...

  5. python jquery初识

     jQuery的介绍 jQuery是一个快速,小巧,功能丰富的JavaScript库.它通过易于使用的API在大量浏览器中运行,使得HTML文档遍历和操作, 事件处理动画和Ajax更加简单.通过多功能 ...

  6. CodeForces - 867E Buy Low Sell High (贪心 +小顶堆)

    https://vjudge.net/problem/CodeForces-867E 题意 一个物品在n天内有n种价格,每天仅能进行买入或卖出或不作为一种操作,可以同时拥有多种物品,问交易后的最大利益 ...

  7. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  8. 038、Docker 的两类存储资源(2019-02-27 周三)

    参考https://www.cnblogs.com/CloudMan6/p/7127843.html   Docker为容器提供了两种存放数据的资源:       1.由storage driver  ...

  9. XXE攻防

    一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文档类型定义(可 ...

  10. for-each 格式

    public class D21LX { public static void main(String arge[]){ fish [] a1=new fish[3]; a1[0] = new fis ...