Skip to content

[原文翻译]Yarn vs npm: 你应该知道的所有内容 #47

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
calidion opened this issue Oct 25, 2016 · 3 comments
Open

[原文翻译]Yarn vs npm: 你应该知道的所有内容 #47

calidion opened this issue Oct 25, 2016 · 3 comments

Comments

@calidion
Copy link
Owner

calidion commented Oct 25, 2016

原文链接:https://www.sitepoint.com/yarn-vs-npm/

文章由Adrian Sandu, Marcello La Rocca, Matt Burnett, Nuria Zuazo and Vildan Softic等人审核,以上排名不分先后。感谢所有SitePoint的审核人员的让SitePoint的内容做的尽善尽美。

Yarn是一个新的Javascript包管理器,它由Facebook, Google, Exponent and Tilde共同开发完成。正如官方的声明所说,它的目标是解决这些团队在使用npm过程中碰到的问题的。也就是:

  • 安装包速度不够快或者一致性不好
  • 一些安全方面的问题,因为npm允许在包安装的时候运行代码

不过,你没有必要紧张!它并不是试图完全取代npm的。Yarn只是一个新的CLI客户端,它从npm注册表获取模块。注册表本身并不会有任何的变化——你还是可以跟原来一样去获取以及发布包。

每个人都应该马上赶上这趟高铁吗?通常来说,你不会在使用npm时碰到上面的问题。所以在这篇文章里,我们将对npm与Yarn进行比较,你再决定使用那个对你来说更好用。

Yarn vs npm: 功能上的差异

咋一看Npm与Yarn其实并没有大的差别。但是抽丝剥茧,仔细的分析,我们还是能找到差异的。

yarn.lock文件

package.js是npm和Yarn共同的维护项目依赖的文件,但是package.json的版本是不准确的。而且,你还可以定义一个版本段。这样你可以为一个包选择一个确定的主版本和子版本,然后还可以允许npm安装最新的补丁,这些补丁可能包含一些对bug的修复。

理想状态下的语义化版本管理中,补丁不应该被引入会导致之前代码无法工作的变化。但是很遗憾,这个并不总是成立的。在npm这种策略下,可能会导致相同的package.json在两个不同的机器安装的包的版本是不同的,从而引入了可能的bug。

为了保证包版本的错误匹配,精确版本号会被yarn的lock文件记录下来。每次模块的添加,Yarn会创建一个yarn.lock文件。这样就可以保证另一个机器安装的了完全相同的版本的包,并且同时在package.json里仍保存着一个充许的版本段。

在npm里shrinkwrap命令也会产生lock文件,然后npm在读取package.json之前会读取那个文件,跟Yarn读取yarn.lock类似。不同点是Yarn总是会自动的更新yarn.lock文件,而npm需要你自己去手动维护。

yarn.lock 文档
地址: https://yarnpkg.com/en/docs/configuration#toc-use-yarn-lock-to-pin-your-dependencies
npm shrinkwrap 文档

并行安装

每当npm或者yarn需要安装一个包的时候,会有一系列的任务被执行。在npm里,这些任务是一个包一个包的顺序执行的,也就是说在一个包安装完成之前,下个包是需要等待的。而Yarn并行安装这些任务,所以性能会更高。

为了比较,我安装了express包,使用了npm和Yarn,并且不使用shrinkwrap命令或者lock文件,同时清空缓存。这个过程总共会安装42个包。

npm: 9 秒
Yarn: 1.37 秒

结果我不敢相信!不过重复得到的结果基本一致。然后我安装了gulp包。并得到195个依赖。

npm: 11 秒
Yarn: 7.81 秒

看起来差别跟包的数量有很大的关联。但是不管怎样,Yarn继续保持了更快的速度。

更干净的输出

默认情况下npm是非常罗嗦的。比如,他会在运行npm install 时递归的列出来所有的包。Yarn相反,他一点不罗嗦。如果详情可以通过其它的命名得到,他会通表情(windows平台除外)来明显的减少输入信息。

1476651912yarn-install-output

Yarn vs npm: CLI 上的不同

除了功能的不同外,Yarn的命名也是有所不同的。一些npm命令被删除,一些被修改,还有不少有意思的命令是新添加的。

yarn global

跟npm的全局操作通过-g或者--global标记来执行不同,Yarn需要命令前添加global前缀。跟npm的很象,项目相关的依赖不应该被全局安装。

global前缀只能跟yarn add, yarn bin, yarn ls, yarn remove工作。除了yarn add以外,其它的命令都与npm的对应命令完全一样。

yarn global documentation

yarn install

npm install命令可以从package.json文件里安装依赖,并且允许你添加新的包。yarn install只能安装在yarn.lock或者packag.json里的列出来的依赖,以它们保存的顺序。

yarn install documentation
npm install documentation

yarn add [–dev]

跟 npm install 类似,yarn add 让你添加并且安装一个依赖。如命令名所示,它会添加一个依赖并自动的保存相应的包到package.json,跟npm的--save标记一样。Yarn的--dev标记添加一个_开发依赖_,就象npm的--save-dev标记一样。

yarn add documentation
npm install documentation

yarn licenses [ls|generate-disclaimer]

在写这个文章的时候,npm还没有对应的命令。yarn licenses ls 列出所有安装包的授权信息。yarn licenses generate-disclaimer生成一个包含所有包的授权信息的声明。一些授权信息要求你必须包含它的项目的授权信息,这个命令可以很方便的实现这个功能。

yarn licenses documentation

yarn why

这个命令可以深入剖析依赖图,并且找出来为什么给定的包会被安装到你的项目里来。可能是你自己显式的添加的,也可能是一个你安装的包的一个依赖。yarn why都可以帮助你找出来原因。

yarn why documentation

yarn upgrade

这个命令将包升级到package.json规则指定的版本范围的最新版,而不是yarn.lock所定义的完全一致的版本。想要在npm达成一致的效果,你需要运行下面的命令:

rm -rf node_modules
npm install

这个命令不要跟npm update混淆了,npm update会升级所有的包到最新的版本。

yarn upgrade documentation

yarn generate-lock-entry

这个命令根本package.json里的依赖生成一个yarn.lock文件。与npm shrinkwrap命令是一致的。这个命令使用是需要小心,因为在通过yarn add和yarn upgrade添加或者升级依赖时,yarn.lock会自动的生成或者更新。

yarn generate-lock-entry documentation
npm shrinkwrap documentation

稳定性和可靠性

Yarn这辆高铁会不会脱轨?确实第一天公开发布时就收到了很多的问题报告,但是这个问题解决的速度也很迅速。两者都反映了这个社区在很努力的在寻找和解决问题。仔细分析这些问题的数量与类型,可以发现Yarn对于大多数的用户来说是可靠的,但是可能对于一些特殊的场景并不是很适合。

需要注意的是,一个包管理软件可能对你的项目很重要,但是它也只是一个包管理工具。如果出了问题,重新安装包应该不是一件困难的事情,并且回到npm也没有什么不可以。

未来

可能你了解Node.js和io.js的历史。简单回顾一下就是:io.js曾经是Node.js的一个fork,由一些核心贡献者,在他们对于如何管理这个项目产生分歧之后创建。io.js选择了一个更加开放的管理模式。在不超过一年的情况下,两个团队达成了一致,io.js重新合并到Node.js,并且io.js不再继续开发。不管谁对谁错,这个过程给Node.js带来了不少很显著的功能。
我看npm与Yarn的模式可能也是类似。虽然Yarn并不是fork出来的,但是它改进了几个npm存在的问题。如果npm能从中学习,并请求Facebook, Google和其它Yarn的贡献者帮助改进npm,这样会不会是一件很酷的事情呢? 虽然现在说是不是会发生还太早了,我希望可以。
不管怎样,Yarn的未来应该是光明的。社区表现还是挺兴奋的,并且也很快的在接受新的包管理工具。不过不幸运的是,现在路线图还没有出来,所以我无法确定yarn的葫芦里还卖着什么药。

总结

Yarn与npm相比在很多默认项目上有更好的表现。我们免费得到一个lock文件,非常快的包安装速度,自动的存到package.json中去。Yarn的安装与使用基本不会产生什么影响。你可以在一个项目上尝试,看看是不是能工作起来。这是让Yarn能替代npm的最好的方式。
我肯定会推荐你在一个单一的项目上试一试Yarn。如果你对安装和使用新的软件比较谨慎,你也可以等上几个月。毕竟npm是经过实战检验的,这在软件开发中是很有价值的。

如果你发现你自己正在等npm去完成包的安装,现在可能就是你开始阅读迁移指南的时间:)

你现在的想法是什么?你是不是已经开始使用yarn了?或者你会尝试一下吗?还是这只是一个分裂生态上的另一个未来的分裂?如果你有要话要说,就请留言告诉我吧。

@calidion
Copy link
Owner Author

国内使用yarn的方法:

npm install -g yarn
yarn config set registry https://registry.npm.taobao.org

@q3yi
Copy link

q3yi commented Jun 14, 2017

有个拼写错误:问题报靠 => 问题报告

@tangkunyin
Copy link

棒棒哒

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants