模块之美
首发于模块之美
yarn, 不是又一个 npm 第三方客户端

yarn, 不是又一个 npm 第三方客户端

前情提要: code.facebook.com/posts

仅仅一夜,却也是无数个日夜,Facebook 开源了 yarn 这个新的 JavaScript 包管理工具,这个和 Exponent, Google, 以及 Tilde 合作完成的项目。

Facebook 提供了一种看起来和 npm 无关的安装方式 (mac):

curl -o- -L https://yarnpkg.com/install.sh | bash

在其它平台也可以通过安装文件或者其它包管理系统安装,这样看起来不那么 npm-ish 的方式让我觉得这是有取代 npm 的想法的,虽然我们都爱 npm ;)

当然真正的原因不是这样,这只是因为如果你用 npm 安装 yarn 不就会产生 yarn 想解决的那些问题吗,比如速度、semantic versioning 的不足等等

那 yarn 解决了哪些 npm 的问题呢?yarn:


非常快,非常非常快

yarn 缓存了每次你下载的模块,所以同样模块同样的版本不会发送第二次下载请求,对于没有缓存的模块, yarn 也可以通过并行的网络请求最大限度利用网络资源。现在真的是没有什么几十秒安装不完的依赖的。一个 50 个依赖的 webpack + babel 项目可以在 20 秒左右安装完成。有人拿 lockfile 说事,这。。。去掉一个默认的特性还有什么好对比的,你可以参考官方对比 npm 的区别 Compare Yarn Performance

安全

yarn 在开始安装一个包之前会先用 checksums 来验证,你不用担心本地的缓存的包被破坏了导致安装失败。

可靠

被一群喜欢喵星人的开发者维护,以及有 Facebook 在 production 环境中使用。完善的测试和基于 flow type 的 code base。

以及很多令人感动的小改进

1. 有些 npm 包会抛出 warning 提示信息,在以前 npm install 的时候只有一个名字你完全不知道是哪个包的哪个包的哪个包抛出的这个信息,而 yarn 改善了这一点。

2. `yarn ls` 会高亮出所有在 package.json 的 dependencies 里的依赖,增强可读性。

3. 每一条命令都会显示执行的时间。

4. 默认生成 lockfile. 保证 yarn 每次安装相同版本的依赖,npm shrinkwrap 会丧失掉同步性如果你忘了生成它。

5. `yarn why <name>` 这条命令可以告诉你为什么一个依赖会被安装到你的项目中。

6. 更人性化的 npm run:

7. ......countless...


yarn 的架构

yarn 通过把安装拆分成三个步骤来实现并发的请求、更准确的安装结果和更清晰的控制台输出:

  1. 处理: 向 registry 请求每个依赖的信息
  2. 获取: 从 cache 中获取已下载的依赖,如果没有则下载相关依赖的压缩包然后缓存它
  3. 生成: 从缓存中复制相关依赖到项目中的 node_modules 目录中

Fork?

那么问题就来了,yarn 有许多令人激动的特性,但这些为什么不能通过改进 npm 的方式加入而是要重新开发一个客户端呢?

简言之,兼容性。这些改进在现在的 npm 中看起来就像是 breaking changes。

npm

有人开始担心 npm,有人甚至说出了终于可以死掉了, npm!其实 npm 在更早的时候已经参与了 yarn 项目,并且鼓励这一行为,因为对于 npm 这样大范围使用的系统来说直接做出这些可能带来兼容性问题的改进很难。(不要以为 npm 比你制杖)

那 npm 会借鉴吸收 yarn 中不错的地方吗,不太清楚,不过可以确定 npm 不会用猫做 logo,也不会在 cli 中加入可爱的 emoji ;)

This is how open source works.

编辑于 2016-10-12

文章被以下专栏收录