在JavaScript社区,工程师们分享了成百上千的代码段,我们不必本身重新编写基本组件、类库也许框架。反过来,每段代码又也许依靠于别的的代码段,而这些依靠就是经由历程 package managers(包治理器)
来治理的。最盛行的JavaScript包治理器就是 npm客户端
了,它可以接见在npm注册的 300,000 多个装置包。超越500万的工程师运用npm注册,每月的下载量高达 50 亿。
我们成功地在Facebook用了几年的npm客户端。但跟着代码库范围的扩展以及开辟者人数的增添,我们碰到了连贯性
,平安性
和 机能
方面的题目。在迎难而上处置惩罚一个又一个的题目后,我们动手构建一个新的计划,来协助我们更牢靠地治理我们的依靠。实行这项事变的产物名为 Yarn
— 它是一个疾速、牢靠、平安的、可替代的npm客户端。
我们很愉快地宣告与Exponent、 Google 和 Tilde 协作的 Yarn
开源版本。有了 Yarn今后, 软件工程师们依然可以接见npm库,而且可以更快地装置npm包,而且跨机械也许在平安的离线环境下一致性地治理依靠。Yarn 使得工程师可以越发疾速开辟,而且信心百倍地运用分享的代码库,从而专注于更重要的事变 — 构建新的产物和特征。
Facebook JS 包治理器的进化史
在还没包治理器的时刻,JS工程师常常依靠于存储在他们项目中也许放在CDN上面的少许代码段。第一个重要的JS包治理器 npm
在Node.js被引用后不久就搭建起来了,而且敏捷成为世界上最受迎接的包治理器之一。上千个新的开源项目被建立了,工程师们也比以往分享了更多的代码。
很多Facebook的项目(如React),都是依靠于npm包。然则,跟着内部范围的扩展,我们都碰到了如许的题目:当跨机械或用户装置依靠时,拉取依靠包斲丧的时候较长,也斟酌到平安性的题目,由于npm客户端会自动实行这些依靠包内里的代码。我们尝试去处置惩罚这些题目,却发明这些题目还不断地衍生出新的题目。
尝试操纵npm客户端的范围
早先,根据指定的最好实践,我们只是检入 package.json
而且要求开辟者手动地实行npm install
。这足以满足软件工程师的开辟需求,但在我们延续集成的环境中就崩溃了,由于处于平安性和牢靠性的斟酌,这类环境须要沙箱化,而且割断网络服务。
我们的第二个计划是检入一切进入代码库的 node_modules
。这类做法虽然见效,却使得一些底本简朴的操纵变得相称难题。举个例子,更新一个小版本 babel 就会天生一个80万行的commit,这关于无效的UTF8字节串、窗口的行尾退出标记,非 png-crushed 的图片等都很难处置惩罚。工程师们常常都要花上一整天的时候,才能把修改的代码合并到 node_modules
中。我们掌控源代码的团队也指出:搜检 node_modules
文件是对大批元数据负责任的做法。React Native 的 package.json
文件如今只是列出了68个依靠,但实行 npm install
今后,node_modules
目次下就天生了121,358个文件。
我们做了末了一个尝试来计划npm客户端的大小,使之可以和开辟者的数目以及我们所需的代码量来谐和事变。我们以为紧缩全部 node_modules
文件夹,而且把它上传到内部的CDN,如许开辟者和我们延续的集成体系都可以下载,并一致地提取文件。这使得我们可以从原文件中删除成千上百个文件。然则,如许做软件开辟者不仅是拉取照样构建新代码,都须要网络服务。
我们也必需应对 npm shrinkwrap 功用所带来的题目,由于我们经由历程 shrinkwrap 来锁定版本。npm-shrinkwrap.json
不是默许天生的,如果开辟者遗忘天生,就会致使差别步的题目。因而我们写了一个东西,来考证装置包里的文件与 node_modules
中的哪些文件相婚配。npm-shrinkwrap.json
是由大批无序字段构成的 JSON blobs
,所以转变它们就会天生巨大的、没法 review 的commits
。为了紧张这个题目,我们须要分外增加一个脚原本辨别一切的条目。
基于 semantic versioning(语义法版本掌握) 准绳,用npm更新一个简朴的依靠, 也会响应更新很多不相关的依靠。如许使得每次转变的代码量大大增添, 而且必需反复提交 node_modules
也许上传到CDN如许的事变,这个历程对开辟者来说是不抱负的。
构建一个新的客户端
我们决议尝试团体地去对待这个题目,而不是在npm客户端继承修复。如果我们尝试搭建了一个新的客户端来处置惩罚碰到的这些核心题目又会如何呢?我们伦敦事变室的 Sebastian McKenzie 已最先hack这个主意,我们也为它的远景而高兴。
跟着这项事变的睁开,我们最先和差别范畴的工程师交换,并发明他们也碰到一系列相似的题目,也尝试了很多雷同的处置惩罚计划,常常都是专注于处置惩罚眼下的题目。明显,经由历程连系人人所碰到的题目,我们可以开辟一套共用的计划。在来自Exponent、Google 和 Tilde的工程师的协助下,我们搭建了Yarn客户端,并在每一个重要的JS框架上以及Facebook以外的场景测试和考证了它的机能。本日,我们带着冲动的心境来和人人一同分享它。
Yarn 简介
Yarn 是一款新的包治理器,在庖代npm客户端和其他包治理器现有事变流的同时,又保留了对npm代办的兼容性。它具有与现有的事变流雷同的特征,只是操纵起来更快、更平安、更牢靠。
任何包治理器的重要功用都是去装置一些依靠模块 — 一段服务于特定的目标代码 — 从一个全局的注册到开辟者的当地环境。包与包之间可以相互依靠,也多是本身自力的。一个典范的项目标依靠包可以会有几十个、几百个也许是上千个。
这些依靠都是版本化的,而且都是基于 语义版本掌握
装置的。语义版本定义了一套版本的计划,无论是改了一个API,增加了一个新特征,照样修复了一个bug,都会在每一个新版本上反应出来。然则,语义版本须要包开辟者确保不失足,由于在依靠没有锁定的情况下,新的bug或破绽都会被注入到依靠包内里。
体系构造
在Node环境下,依靠都放在你项目标 node_modules
文件夹下。然则,这些文件构造也许和现实的依靠树不一致,由于反复的依靠会被合并到一同。npm客户端在装置依靠到 node_modules
目次时递次不是牢固的。这意味着跟着装置递次的差别,差别开辟者 node_modules
下的目次构造会存在差别。这类差别有可以激发“在我的电脑上是好的”bug,找出这类bug通常是比较耗时的。
Yarn 经由历程 yarn.lock
和一个牢靠、肯定的算法处置惩罚了上面说起的版本掌握和装置递次这些题目。这些锁定文件为装置的依靠增加一个特定的版本号,而且确保在差别机械上装置时 node_modules
目次构造雷同。lockfile
运用简明的誊写花样和有序的 key
来确保修改只管小,review起来越发简朴。
装置历程可拆分为三个步骤:
辨认: 最先经由历程发送要求并顺次查找每一个依靠来辨认个中的依靠关联。
猎取: 接下来,Yarn 检察全局缓存来肯定所需的装置包是不是已下载。如果没有,Yarn 就抓取紧缩包并把它放在全局的缓存中,既可以做到离线事变,也可以确保今后须要时不必再次下载。依靠也可以像紧缩包一样放在源码中,以便离线装置。
衔接: 末了,Yarn 从全局的缓存中复制所需的文件安排到当地的
node_modules
目次下衔接起来。
经由历程明确地拆分这些步骤,获得肯定的效果来完成并行操纵,如许资本应用获得最大化,装置速率也大大提拔。在Facebook 的一些项目中,Yarn 把装置速率提拔了一个梯度,从几分钟到短短几秒。Yarn 也运用互斥来确保多个敕令行装置时不会争执也许相互污染。
Yarn 关于全部紧缩包的装置历程都有严厉的保证。你可以掌握差别生命周期的脚原本实行对应的装置包。紧缩包 校验和
也被存储在 lockfile
以确保你每次都能拿到一样的紧缩包。
特征
除了让装置历程更快更牢靠,Yarn 另有分外的特征来更好地简化依靠治理的事变流。
兼容 npm 和 bower 事变流,而且支撑夹杂注册。
可以限定已装置模块的证书以及输出证书信息。
暴露一个稳固公然的JS API,经由历程构建东西供应笼统的日记纪录。
可读、最小化、优越的敕令行输出。
Yarn 在临盆环境下
我们已在 Facebook 的临盆环境下运用 Yarn 了,也运转得相称好。它很有力度地为我们的很多 JavaScript 项目治理了依靠和紧缩包。跟着每次晋级,工程师们已可以离线搭建,而且加快他们的事变流。你可以在这里 检察差别环境下 React Native 分别用 Yarn 和 npm 的装置所斲丧的时候。
<figure></figure>
最先运用
最简朴的运用体式格局就是运转敕令:
npm install -g yarnpkg
yarn
在你的开辟流程中 yarn
CLI 庖代了 npm
, 要么用一个婚配的敕令,要么运用一个新的、简朴的敕令:
npm install
→yarn
不带参数的情况下,yarn
敕令会读取你的 package.json
文件,从 npm 库中抓取所需的紧缩包然后天生 node_modules
文件夹。这跟你运转 npm install
是一样的。
我们移除了 npm install
<name> 的隐形依靠并拆分了敕令。实行
yarn 背面加上
<name> 与
npm install –save <name>
的是一样的。
将来
我们很多人群集到一同,配合搭建了 Yarn 来处置惩罚罕见的题目。我们愿望 Yarn 可以真正成为一个开源项目,轻易每一个人运用。Yarn 如今已放到 github 上了。我们也迎接 Node 社区的同伴们运用 Yarn,分享idea,撰写文档,我们相互支撑,让更多人来关注它、运用它!我们置信 Yarn 已有个很好的开端了,将来在人人的协助下,一定会变得更好!