2019 年 6 月 React Native 开源更新
代码与社区健康
在过去的六个月里,超过550位贡献者对React Native进行了总计2800次提交。来自社区的400位贡献者创建了超过1150个拉取请求(Pull Requests),其中有820个拉取请求被合并。
在过去的六个月中,尽管我们通过“精简核心(Lean Core)”工作将网站、CLI和许多模块从React Native中分离出去,但每天的平均拉取请求数量已从三个增加到大约六个。现在,平均未决拉取请求数量低于25个,我们通常在几小时或几天内给出建议和评论。
有意义的社区贡献
我们想重点介绍一些我们认为非常棒的近期贡献
- 可访问性:React Native 0.60将在Android和iOS上带来许多可访问性API的改进。所有新功能都直接使用底层平台提供的API,因此它们将与Android和iOS上的原生辅助技术集成。我们要感谢Marc Mulcahy、Alan Kenyon、Estevão Lucas、Sam Mathias Weggersen和Janic Duplessis的贡献。
- 额外的可访问性角色+状态和新的可访问性状态API。为各种组件添加了许多缺失的可访问性角色,并为未来更好的网络支持添加了新API。
- AccessibilityInfo.announceForAccessibility。增加了对Android的支持,以前仅限iOS。
- 扩展的可访问性操作支持。添加了回调以处理用户定义操作周围的可访问性。
- 支持iOS可访问性标志和支持“减少动态”。
- Android键盘可访问性改进。添加了
clickable
属性和onClick
回调,用于通过键盘导航调用操作(注意:此属性很快将更名为focusable
)。 - 使用CALayers绘制文本。修复了导致放大文本在iOS上消失的问题。
- 新应用屏幕:社区为0.60中实现的新应用屏幕提出了一个设计。这个屏幕是大多数人初次使用React Native时会看到的。它现在将首次用户链接到文档,并且外观与我们即将进行的网站重新设计相符🌟。非常感谢Orta、Adam Shurson、Glauber Castro、Karan Singh、Eli Perkins、Lucas Bento和Eric Lewis为他们的所有工作和协作!
- 在“React Native Show”视频系列中查看新的应用程序屏幕。
- TurboModule 类型:新的TurboModules 系统要求所有原生模块都具有类型,以保证原生操作的类型安全。在短短两周内,社区发送了大约40个拉取请求,完成了Flow类型原生模块的这项工作。除了上面已经提到的人员外,我们还要感谢Michał Chudziak、Michał Pierzchała、Wojtek Szafraniec和Jean Regisser以及所有发送了一个或多个拉取请求的其他人。
- Haste:自2015年以来,React Native使用“haste”模块系统,该系统允许仅通过全局ID而不是相对路径导入模块,这很方便但许多工具不支持。 James Ide提议删除haste,类似于React多年前删除haste的方式。他通过一个总括任务规划了所有工作,并发送了18个拉取请求来实现它!查看他的Twitter帖子以了解更多信息。
- Android Fragments:John Shelley关于通过Android Fragments使React Native工作的提案已被合并,并将在0.61版本中提供。在此处阅读有关Android Fragments的更多信息。
精益核心
“精简核心(Lean Core)”的主要目的是将React Native中的模块拆分到单独的仓库中,以便它们能够得到更好的维护。在短短六个月内,像WebView、NetInfo、AsyncStorage、网站和CLI等仓库总共收到了800多个拉取请求。除了更好的维护之外,这些项目还可以比React Native本身更频繁地独立发布。
我们还借此机会从React Native本身中移除了过时的Polyfills和遗留组件。在过去,为了在旧版JavaScriptCore(JSC)中支持像Map
和Set
这样的语言特性,Polyfills是必要的。现在React Native附带了新版本,这些Polyfills已被移除。
这项工作仍在进行中,在原生和JavaScript方面仍有许多东西需要拆分或移除,但早期迹象表明我们成功地扭转了增加面积和应用大小的趋势:例如,查看JavaScript包,大约一年前,在0.54版本中,React Native JavaScript包大小为530kb,在短短6个月内增长到0.57版本的607kb(+77kb)。现在我们看到主分支上的包大小减少了28kb,降至579kb,增量超过100kb!
随着我们完成“精简核心”工作的首次迭代,我们将努力更有意图地向 React Native 添加新 API,并持续评估如何使 React Native 更小、更快,以及寻找方法赋能社区拥有各种组件的所有权。
用户反馈
六个月前,我们向社区提问“您不喜欢React Native的哪些方面?”,这很好地概述了人们面临的问题。我们在几个月前回复了该帖子,现在是时候总结一下在主要问题上取得的进展了
- 升级:React Native 社区齐心协力,对升级体验进行了多项改进:自动链接,通过rn-diff-purge实现更好的升级命令,以及一个升级助手网站(即将推出)。我们还将通过发布每个主要版本的博客文章来确保传达破坏性更改和令人兴奋的新功能。这些改进中的许多都将使0.60版本之后的未来升级变得更加容易。
- 支持/不确定性:许多人对拉取请求缺乏活动以及Facebook对React Native投资的普遍不确定性感到沮丧。正如我们上面所示,我们可以自信地说,我们已准备好迎接更多拉取请求,并且我们热切期待您的提议和贡献!
- 性能:React Native 0.59附带了一个新的、速度更快的JavaScriptCore (JSC)版本。此外,我们一直在努力使内联requires更容易默认启用,并且在接下来的几个月里,我们将为您带来更多令人兴奋的更新。
- 文档:我们最近开始着手全面修订和重写所有React Native文档。如果您希望贡献,我们很乐意获得您的帮助!
- Xcode 中的警告:我们清除了所有现有警告,并正在努力不引入新警告。
- 热重载:React 团队正在构建一个新的热重载系统,该系统很快将集成到 React Native 中。
不幸的是,我们尚未能改进所有方面。
- 调试:我们修复了许多我们每天都会遇到的令人不便的错误和问题,但不幸的是,在这方面我们还没有取得我们所期望的进展。我们认识到使用React Native进行调试并不理想,我们将在未来优先改进这一点。
- Metro 符号链接:不幸的是,我们尚未能为此实现一个简单直接的解决方案。不过,React Native 用户分享了各种可能对您有用的变通方法。
鉴于过去六个月的巨大变化,我们想再次提出同样的问题。如果您正在使用最新版本的 React Native 并希望提供反馈,请在我们的新一期“您不喜欢 React Native 的哪些方面?”中发表评论。
持续集成
Facebook 会首先将所有拉取请求和内部更改直接合并到 Facebook 的仓库中,然后将所有提交同步回 GitHub。Facebook 的基础设施与常见的持续集成服务不同,并非所有开源测试都在 Facebook 内部运行。这意味着同步到 GitHub 的提交经常会破坏开源测试,而修复这些测试需要大量时间。
来自 React Native 团队的Héctor Ramos在过去的两个月里,致力于改进 React Native 在 Facebook 和 GitHub 上的持续集成系统。现在,大部分开源测试在更改提交到 Facebook 的 React Native 之前运行,这将在提交同步时保持 GitHub 上的持续集成稳定。
下一步
请务必查看我们关于 React Native 未来的演讲!在接下来的几个月里,Facebook 的 React Native 团队成员将在Chain React和React Native EU上发表演讲。此外,请关注我们的下一个版本 0.60,它即将发布。这将是令人兴奋的 ✨