随着这项工作的展开,我们开始和不同领域的工程师交流,开奖,并发现他们也遇到一系列类似的问题,也尝试了很多相同的解决方案,经常都是专注于解决眼下的问题。显然,通过结合大家所遇到的问题,我们可以开发一套共用的方案。在来自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 使用简明的书写格式和有序的 键 来确保改动尽量小,review起来更加简单。 安装过程可拆分为三个步骤: 识别: 开始通过发送请求并依次查找每个依赖来识别其中的依赖关系。 获取: 接下来,Yarn 查看全局缓存来确定所需的安装包是否已经下载。如果没有,Yarn 就抓取压缩包并把它放在全局的缓存中,既可以做到离线工作,也可以确保以后需要时无须再次下载。依赖也可以像压缩包一样放在源码中,以便离线安装。 连接: 最后,Yarn 从全局的缓存中复制所需的文件放置到本地的 node_modules 目录下连接起来。 通过明确地拆分这些步骤,得到确定的结果来实现并行操作,这样资源利用得到最大化,安装速度也大大提升。在Facebook 的一些项目中,Yarn 把安装速度提升了一个梯度,从几分钟到短短几秒。Yarn 也使用互斥来确保多个命令行安装时不会冲突或者互相污染。 Yarn 对于整个压缩包的安装过程都有严格的保证。你可以控制不同生命周期的脚本来执行对应的安装包。压缩包 校验和 也被存储在 lockfile 以确保你每次都能拿到同样的压缩包。 特性 除了让安装过程更快更可靠,Yarn 还有额外的特性来更好地简化依赖管理的工作流。 兼容 npm 和 bower 工作流,并且支持混合注册。 能够限制已安装模块的证书以及输出证书信息。 暴露一个稳定公开的JS API,通过构建工具提供抽象的日志记录。 可读、最小化、良好的命令行输出。 Yarn 在生产环境下 我们已经在 Facebook 的生产环境下使用 Yarn 了,也运行得相当好。它颇有力度地为我们的很多 Java 项目管理了依赖和压缩包。随着每次升级,工程师们已经能够离线搭建,并且加速他们的工作流。你可以在这里 查看不同环境下 React Native 分别用 Yarn 和 npm 的安装所消耗的时间。
开始使用 最简单的使用方式就是运行命令:
在你的开发流程中 yarn CLI 取代了 npm , 要么用一个匹配的命令,要么使用一个新的、简单的命令: npm install → yarn (责任编辑:本港台直播) |