- 原文地址:Yarn vs npm: Everything You Need to Know
- 原文做者:Tim Severien
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:EmilyQiRabbit
- 校对者:jerryOnlyZRJ,TUARAN
Yarn 是一个由 Facebook,Google,Exponent 和 Tilde 构建的新的 JavaScript 包管理器。正如官方公告所写,它的目标就是解决这些团队使用 npm 的时候所遇到的几个问题,即:前端
可是,没必要慌张!它并非想要彻底替代 npm。Yarn 仅仅是一个可以从 npm 仓库获取到模块的新的 CLI 客户端。android
如今每一个人都应该跳上 Yarn 这辆快车吗?可能你在使用 npm 的时候你从没遇到过这些问题。在这篇文章中,咱们将会比对 npm 和 Yarn,因此你就可以决定哪一个对你来讲是最好的。ios
初看 Yarn 和 npm,它们很类似。但正如咱们深刻了解所知,Yarn 和 npm 是有所区别的。git
package.json
文件中有 npm 和 Yarn 追踪项目依赖的信息,版本号并不老是确切的。可是,你能够定义版本的范围。这样你能够选择包的最高和最低版本,可是容许 npm 安装最新的补丁,来修复一些 bug。github
在 语义版本控制 的理想世界里,发布的补丁不该该包括任何实质性的修改。可是很不幸,这并不老是事实。npm 的策略可能会致使两台设备使用一样的 package.json
文件,但安装了不一样版本的包,这可能致使故障。express
为了不包版本的错误匹配,在锁定文件中须要固定安装的确切版本。每次添加模块,Yarn 会建立(或更新)一个 yarn.lock
文件。这样你就能保证在 package.json
文件中定义一个可选版本范围的同时,其余设备都安装同样的包。npm
在 npm 命令中,npm shrinkwrap
一样能够生成一个锁定文件,而且 npm install
在读取 package.json
以前会先读这个锁文件,和 Yarn 会首先读取 yarn.lock
的方式相似。最关键的区别是,Yarn 必定会建立并更新 yarn.lock
,可是 npm 默认不会建立,而且只会当文件 npm-shrinkwrap.json
存在时更新它。json
不管什么时候 npm 或者 Yarn 须要安装包,都会产出一系列的任务。使用 npm 时,这些任务按包顺序执行,也就是只有当一个包所有安装完成后,才会安装下一个。Yarn 则是并行执行任务,提升了性能。gulp
对比来讲,我同时使用 npm 和 Yarn 安装了包 express,它们都没有 shrinkwrap 或者 lock 文件也没有缓存。此次安装一共包括 42 个包。后端
propertag.cmd.push(function() { proper_display('sitepoint_content_1'); });
我简直不敢相信个人眼睛。重复这个步骤的结果是类似的。而后我安装了包 gulp,共下载 195 个依赖包。
看起来,下载时间的差别很大程度取决于安装的软件包的数量。可是不管那种,Yarn 都更快。
npm 的输出默认就很详细。例如,当运行 npm install <package>
的时候,它将会递归的列出全部安装了的包。而另外一方面,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 <package>
相似,yarn add <package>
让你能添加并安装依赖。正如命令名的字面义,它能添加依赖,同时意味着它将自动的把包的引用添加到 package.json
文件中,和 npm 的 --save
标志同样。Yarn 的 --dev
标志会把包做为开发模式的依赖,和 npm 的 --save-dev
标志同样。
在写本篇文章的时候,yarn 上还有一些 npm 上没有的等价可用的命令。yarn licenses ls
可以列出全部安装包的许可协议。yarn licenses generate-disclaimer
能生成包括全部包的全部许可协议的免责声明。一些许可协议声明了你必须在你的项目中包含该项目协议,此时该命令就是一个颇有用的工具了。
这个命令可以分析依赖图而后找出为何指定的包会被安装到你的项目中。也许是你明确指定安装它的,或许它是你安装的包的依赖之一。yarn why
将帮助你查明缘由。
这个命令将更新包到符合 package.json
设定规则的最新的版本,并从新建立 yarn.lock
文件。它和 npm update
相似。
有趣的是,当指定包的时候,它将会将这个包更新到最新版并更新 package.json
中定义的标签。这意味着这个命令可能将包更新到一个新的 major 发布。
yarn generate-lock-entry
命令将生成一个 yarn.lock
文件,它是基于 package.json
中的依赖设定的。这和 npm shrinkwrap
很相似。使用这个命令要谨慎,由于它将生成锁定文件,而且当你经过 yarn add
和 yarn upgrade
更新依赖的时候,它会自动更新。
Yarn 的快车可能脱轨吗?在发布的第一天,它确实收到了不少问题反馈,可是解决问题的效率一样惊人。这都意味着社区在努力寻找并解决问题。看看这些问题的数量和种类后咱们知道,Yarn 对于大多数用户都是更加稳定的,可是对于一些边缘状况,可能就不太适合了。
注意,尽管可能包管理对于你的项目很是重要,它也仅仅是一个包管理器。若是真的有什么问题出现了,重装包并不难,切回使用 npm 也不难。
也许你知道 Node.js 和 io.js 的历史。归纳的说,io.js 是 Node.js 的一个分叉,因为 Node.js 项目的管理出现了分歧,一些核心贡献者就建立了 io.js。可是,io.js 选择了开源。不到一年的时间,两个团队又达成了一致,因而 io.js 又合并回了 Node.js,io.js 的研发也就再也不进行了。不管这样的选择如今来看是对是错,这件事的结果是为 Node.js 引入了不少很棒的功能。
我如今在 npm 和 Yarn 上看到了相似的模式。尽管 Yarn 不是一个分叉,可是它改进了数个 npm 的漏洞。若是 npm 从中学习,并要求 Facebook,Google 以及其余 Yarn 贡献者转而帮助 npm 优化,这不是很好的事情吗?尽管如今这样说有些早了,可是我但愿如此。
无论怎样,Yarn 的将来都是光明的。这个新的包管理器的出现让社区里的人都感到很兴奋,而且人们也渐渐接受了它。不幸的是,它没有任何规划说明,因此我也不知道 Yarn 会给咱们准备什么惊喜。
和 npm 相比,Yarn 的评分更高。咱们能够自由的获取锁定文件,安装包的速度也惊人的快,并且它们会被自动的保存到 package.json
。安装并使用 Yarn 的缺点也不多。你能够先在一个项目中试用它,看看是否适合于你。这样,Yarn 就成为了 npm 一个替代品。
propertag.cmd.push(function() { proper_display('sitepoint_content_2'); });
我强烈推荐你在一个项目中试试看 Yarn。若是你对于安装和使用新的软件很谨慎,也请给它几个月的时间。毕竟,npm 是通过实战检验的,这在软件开发的世界中,绝对值得。
若是你正巧在等着 npm 安装包,也许正好能够读一读迁移到 Yarn 的指南 ;)
看完文章后你以为怎样?你已经在使用 Yarn 了吗?你愿意尝试吗?或者你认为这仅会致使一个已经很分散的生态圈的进一步分裂?请在评论区写下你的见解。
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。