10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

Facebook 开源 JavaScript 包管理器 Yarn

2016 年 10 月 17 日

Facebook 开源了 Yarn ,这是针对存储在 npm 或 Bower 注册表中的 JavaScript 模块的一个代理包管理器。

按照其三位工程师所撰写的博客文章,多年以来,Facebook 一直非常成功地使用 npm 客户端。在他们的团队中,这起初运行得很不错,直到代码库增长到一个点,此时“一致性、安全性以及性能”方面的问题开始浮现:

在 Facebook,我们的很多项目,比如 React,都会依赖 npm 注册表中的代码。但是,随着内部的扩展,当在不同的机器和用户上安装依赖时,我们遇到了一致性的问题,还要考虑到加载依赖所消耗的时间,另外,npm 客户端在加载某些依赖的时候,会自动执行代码,这也会带来安全方面的问题。

Facebook 提到了通过 CI 工具运行npm install时的问题,因为处于安全的考虑,他们的环境与互联网是互相切断的。最直接的解决方案就是单独下载所需的模块,并将它们包含到项目的源码中。但是,更新其中的某些模块会带来很大的影响:

例如,更新 babel 的一个小版本都会导致 800,000 行的提交,这样的话,对于非法 utf8 字节序列、Windows 换行符以及 non png-crushed 图片触发 lint 规则校验就会非常困难。对node_modules合并变更经常会耗费工程师一整天的时间。

他们所做的最后一次尝试就是从源码中移除这些模块,并将其放到内部的 CDN 上。但是,这意味着要为开发和 CI 构建机器提供互联网的连接,而这是无法接受的。最终,他们构建了自己的包管理器,名为 Yarn,Facebook 认为它是快速、可靠和安全的。

Yarn 具有多项特性:

  • 离线模式(Offline Mode):如果你之前安装过某个包,那么你可以在没有互联网连接的情况下,对这个包进行重新安装。
  • 确定性(Deterministic):不管安装顺序如何,相同的依赖在每台机器上会以完全相同的方式进行安装。
  • 网络性能:Yarn 会对请求进行高效地排队,避免出现请求瀑布(waterfall),便于将网络的使用效率达到最大化。
  • 网络弹性(Network Resilience):单个请求的失败不会导致整个安装的失败,请求会基于故障进行重试。
  • 扁平模式(Flat Mode):将不匹配的依赖版本都会解析为同一个版本,避免重复创建。

另外值得一提的特性就是 Yarn 能够与 npm 和 Bower 注册表协作使用。

经营 npm 注册表的 npm 公司对 Yarn 表示欢迎,因为这是对已有 Node.js 管理器的一个补充,值得注意的是,尽管 Yarn 会从 registry.yarnpkg.com 抓取包,但这个仓库仅仅是官方 npm 注册表的一个代理。还有 Facebook 没有明确提及的一点,Yarn 的另外一个目的在于:在 npm 注册表宕机时,所有的 Node 模块能有一个安全的备份,因为在今年春天 npm 曾经停机 2.5 小时,导致世界范围内成千上万的开发人员构建失败。除非具有像 Facebook 那样的扩展性和开发需求,Yarn 不一定是必须的,但是通过代理来获取包能够在原始注册表发生宕机时,提供一个弹性层。

Facebook 还介绍说 Yarn 是与 Exponent、Google 和 Tilde 协作的成果。它的代码已经基于BSD 许可证协议在GitHub 上开源

查看英文原文 Facebook Open Sources Yarn, a JavaScript Package Manager

2016 年 10 月 17 日 19:001977

评论

发布
暂无评论
发现更多内容

从四个问题透析Linux下C++编译&链接

华为云开发者社区

c++ Linux 编程

架构师训练营第二周作业

Shunyi

极客大学架构师训练营

苹果A14 Bionic人工智能算力翻倍,AIOps产品落地加速引领AI生态建设逐步完善

博睿数据

人工智能 运维 APM 运维自动化 AIOPS

2020中国科技峰会系列活动青年科学家沙龙——AI学术生态与产业创新圆满召开

极客播报

人工智能 2020 中国科技峰会 青年科学家沙龙 中国科协

架构师训练营作业一:食堂就餐卡系统设计

zjzj2017

UML

为什么区块链巨头企业一定会诞生在中国的原因分析

CECBC区块链专委会

区块链 科技

架构师训练营 Week2 作业 1

lucian

极客大学架构师训练营

架构师训练营—第二周作业

Geek_shu1988

架构师1期-框架设计作业

ltl3884

极客大学架构师训练营

LeetCode题解:589. N叉树的前序遍历,递归,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

华为:与全球180万云与计算开发者共成长,共创行业新价值

华为云开发者社区

架构师训练营 Week2 作业 2【学习总结】

lucian

极客大学架构师训练营

架构师训练营第二周心得

CmHuang

一个草根的日常杂碎(9月26日)

刘新吾

社会百态 生活随想 时评杂谈

架构师训练营第二周作业

四夕晖

依赖倒置原则

学习笔记:架构师训练营-第二周

四夕晖

面向对象 面向对象思想 面向对象编程

第二周作业

熊桂平

极客大学架构师训练营

请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。

orchid9

Bilibili资深运维工程师:DCDN在游戏应用加速中的实践

阿里云Edge Plus

运维 CDN

第二周总结

orchid9

国内首个区块链村正式落地:数字经济的裂变之路

CECBC区块链专委会

区块链 数字经济

电商小游戏火爆,开发者如何快速接入?看这里

白开水

egret 淘宝电商 淘宝小程序 淘宝小游戏 电商小游戏

华为侯金龙:打造行业智能体,共建全场景智慧

华为云开发者社区

华为云 经济 智能

【API进阶之路】太秃然了,老板要我一周内检测并导入一万个小时的视频

华为云开发者社区

视频 API

架构师训练营 1 期 - 第二周总结(vaik)

行之

架构师训练营第二周学习总结

薛凯

架构师训练营—第二周学习总结

Geek_shu1988

第 2 周 作业

Pyr0man1ac

请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

orchid9

【架构师训练营第1期 02 周】 作业

Bear

极客大学架构师训练营

架构师1期-框架设计学习总结

ltl3884

极客大学架构师训练营

Facebook开源JavaScript包管理器Yarn-InfoQ