Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。就像咱们能够从官方文档了解那样,它的目的是解决这些团队使用 npm 面临的少数问题,即:node
但请不要惊慌!它并无试图彻底取代 npm。Yarn 一样是一个从 npm 注册源获取模块的新的 CLI 客户端。注册的方式不会有任何变化 —— 你一样能够正常获取与发布包。git
是否每一个人如今都要跳上 Yarn 这辆被大肆宣传的列车?又或者你根本没机会碰到 npm 的这些问题。本篇文章将会比较 npm 与 Yarn,最终你能够决定哪款更适合你。github
乍一看 Yarn 与 npm 很相似,但经过引擎的对比就能察觉 Yarn 的不一样。web
npm 和 Yarn 都使用 package.json
来跟踪项目的依赖,版本号并不是一直准确,由于你能够定义版本号范围,这样你能够选择一个主版本和次要版本的包,但让 npm 安装最新的补丁也许能够修改一些 bug。express
理想状态下使用语义化版本发布补丁不会包含大的变化,但不幸的是这必非真理。npm 的这种策略可能致使两台拥有相同 package.json
文件的机子安装了不一样版本的包,这可能致使一些错误。npm
为了不包版本的错误匹配,一个肯定的安装版本被固定在一个锁文件中。每次模块被添加时,Yarn 就会建立(或更新)yarn.lock
文件,这样你就能够保证其它机子也安装相同版本的包,同时包含了 package.json
中定义的一系列容许的版本。json
在 npm 中一样可使用 npm shrinkwrap
命令来生成一个锁文件,这样在使用 npm install
时会在读取 package.json
前先读取这个文件,就像 Yarn 会先读取yarn.lock
同样。这里的区别是 Yarn 总会自动更新 yarn.lock
,而 npm 须要你从新操做。gulp
每当 npm 或 Yarn 须要安装一个包时,它会进行一系列的任务。在 npm 中这些任务是按包的顺序一个个执行,这意味着必须等待上一个包被完整安装才会进入下一个;Yarn 则并行的执行这些任务,提升了性能。缓存
为了比较,我在没有使用 shrinkwrap/yarn.lock 的方式以及清理了缓存下使用 npm 与 Yarn 安装 express,总共安装了 42 个依赖。安全
我没法相信本身的眼睛,因此重复以上步骤,但获得相同结果。接着我安装 gulp 进行测试,总共安装了 195 个依赖。
彷佛根据所须要安装的包的数量而有所不一样,但 Yarn 依旧比较快。
npm 默认状况下很是冗余,例如使用 npm install
时它会递归列出全部安装的信息;而 Yarn 则一点也不冗余,当可使用其它命令时,它适当的使用 emojis 表情来减小信息(Windows 除外)。
除了一些功能差别,Yarn 命令也存在一些区别。例如移除或修改了一些 npm 命令以及添加了几个有趣的命令。
不像 npm 添加 -g
或 --global
能够进行全局安装,Yarn 使用的是 global
前缀。不过与 npm 相似,项目依赖不推荐全局安装。
global
前缀只能用于 yarn add
, yarn bin
, yarn ls
和 yarn remove
,除yarn add
外,这些命令都和 npm 等效。
npm install
命令会根据 package.json
安装依赖以及容许你添加新的模块;yarn install
仅会按 yarn.lock
或 package.json
里面的依赖顺序来安装模块。
与 npm install
相似,yarn add
容许你添加与安装模块,就像命令的名称同样,添加依赖意味着也会算定将依赖写入 package.json
,相似 npm 的 --save
参数;Yarn 的 --dev
参数则是添加开发依赖,相似 npm 的 --save-dev
参数。
npm 没有相似命令来方便编写本身的包。yarn licenses ls
列出全部已安装包的许可协议。yarn licenses generate-disclaimer
生成包含已安装包许可协议的免责声明。某些协议要求使用者必须在项目中包含该协议,这时候该命令将变得很是好用。
该命令会查找依赖关系并找出为何会将某些包安装在你的项目中。也许你明确为何添加,也许它只是你安装包中的一个依赖,yarn why
能够帮你弄找出。
该命令会根据符合 package.json
设定的规则而不是 yarn.lock
定义的确切版原本将包更新到最新版本。若是想用 npm 来实现相同目的,能够这样执行:
1
2
|
rm -rf node_modules
npm install
|
不要将该命令与 npm update
混淆,它指的是更新到本身的最新版。
yarn generate-lock-entry
会基于 package.json
设置的依赖生成 yarn.lock
文件,该命令与 npm shrinkwrap
相似,但应该当心使用,由于经过 yarn add
和 yarn upgrade
命令添加或更新依赖时会自动更新生成该锁文件。
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 久经考验,它在软件开发领域也有存在的价值。