React Native 开源更新 2019 年 6 月
代码和社区健康
在过去的六个月里,共有 550 多位贡献者向 React Native 提交了 2800 次提交。来自社区的 400 位贡献者创建了超过 1,150 个 Pull Requests,其中 820 个 Pull Requests 已合并。
在过去六个月中,平均每天的 Pull Requests 数量从三个增加到大约六个,即使我们通过精简核心工作将网站、CLI 和许多模块从 React Native 中分离出来。现在,平均未处理的 pull requests 数量已降至 25 个以下,我们通常会在数小时或数天内回复建议和评论。
有意义的社区贡献
我们想重点介绍一些我们认为很棒的近期贡献
- 无障碍功能: React Native 0.60 将发布,其中包含对 Android 和 iOS 上无障碍 API 的许多改进。所有新功能都直接使用底层平台提供的 API,因此它们将与 Android 和 iOS 上的原生辅助技术集成。我们要感谢 Marc Mulcahy、Alan Kenyon、Estevão Lucas、Sam Mathias Weggersen 和 Janic Duplessis 的贡献
- 额外的无障碍角色 + 状态 和 全新的无障碍状态 API。为各种组件添加了许多缺失的无障碍角色,并为未来更好的 Web 支持添加了新的 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 个 Pull Requests,完成了 flow 类型原生模块的这项工作。除了上面已经提到的人之外,我们还要感谢 Michał Chudziak、Michał Pierzchała、Wojtek Szafraniec 和 Jean Regisser 以及其他所有发送了一个或多个 Pull Requests 的人。
- Haste: 自 2015 年以来,React Native 使用了 “haste”模块系统,该系统允许仅通过全局 ID 而不是相对路径导入模块,这很方便,但许多工具不支持。James Ide 提议删除 haste,类似于 React 多年前删除 haste 的方式。他通过一个 总括任务 计划了所有工作,并发送了 18 个 Pull Requests 来实现它!查看 他的 Twitter 帖子 以了解更多信息。
- Android Fragments: John Shelley 关于使 React Native 通过 Android Fragments 工作的提案已合并,将在 0.61 中提供。 在此处阅读有关 Android Fragments 的更多信息。
精简核心
精简核心 的主要动机是将模块从 React Native 中分离出来到单独的存储库中,以便它们可以获得更好的维护。在短短六个月内,WebView、NetInfo、AsyncStorage、网站 和 CLI 等存储库总共收到了超过 800 个 Pull Requests。除了更好的维护之外,这些项目还可以比 React Native 本身更频繁地独立发布。
我们还借此机会从 React Native 本身中删除了过时的 polyfill 和旧版组件。过去需要 Polyfill 来支持旧版 JavaScriptCore (JSC) 中的 Map
和 Set
等语言特性。现在 React Native 附带了一个新版本,这些 polyfill 已被删除。
这项工作仍在进行中,本地和 JavaScript 端还需要分离或删除更多内容,但早期迹象表明我们成功扭转了表面积和应用大小增加的趋势:例如,查看 JavaScript 包,大约一年前的 0.54 版本中,React Native JavaScript 包大小为 530kb,并在短短 6 个月内增长到 0.57 版本的 607kb(+77kb)。现在我们看到主分支上的包大小减少了 28kb,降至 579kb,降幅超过 100kb!
随着我们完成精简核心工作的第一次迭代,我们将努力更加有意识地添加新 API 到 React Native 中,并将不断评估使 React Native 更小、更快的方法,以及寻找授权社区拥有各种组件所有权的方法。
用户反馈
六个月前,我们向社区询问了“你讨厌 React Native 的什么地方?”,这很好地概述了人们面临的问题。我们 在几个月前回复了该帖子,现在是时候总结一下在首要问题上取得的进展了
- 升级: React Native 社区团结起来,对升级体验进行了多项改进:自动链接、通过 rn-diff-purge 改进的升级命令、升级帮助网站(即将推出)。我们还将确保通过为每个主要版本发布博客文章来传达重大更改和令人兴奋的新功能。这些改进中的许多将使 0.60 版本之后的未来升级变得更加容易。
- 支持/不确定性: 许多人对 Pull Requests 缺乏活动以及 Facebook 对 React Native 投资的总体不确定性感到沮丧。正如我们在上面展示的那样,我们可以自信地说,我们已准备好迎接更多的 Pull Requests,并且我们热切期待您的提案和贡献!
- 性能: React Native 0.59 附带了一个新的、速度更快的 JavaScriptCore (JSC) 版本。另外,我们一直在努力使其更容易默认启用 inline-requires,并且在接下来的几个月中,我们将为您带来更多令人兴奋的更新。
- 文档: 我们最近开始努力 彻底修改和重写 React Native 的所有文档。如果您想贡献力量,我们很乐意得到您的帮助!
- Xcode 中的警告: 我们 摆脱了所有现有的警告,并努力不引入新的警告。
- 热重载: React 团队正在构建一个 新的热重载系统,该系统将很快集成到 React Native 中。
不幸的是,我们还无法改进所有内容
- 调试: 我们修复了人们每天都会遇到许多不方便的错误和问题,但不幸的是,我们在这方面没有取得我们希望的那么大的进展。我们认识到使用 React Native 进行调试并不理想,我们将在未来优先改进这一点。
- Metro 符号链接: 不幸的是,我们尚未能够为此实现一个简单明了的解决方案。但是,React Native 用户 分享了各种解决方法,这些方法可能对您有用。
鉴于过去六个月的大量更改,我们想再次问您同样的问题。如果您正在使用最新版本的 React Native,并且您想提供反馈,请在我们的新版 “你讨厌 React Native 的什么地方?” 上发表评论
持续集成
Facebook 首先将所有 Pull Requests 和内部更改直接合并到 Facebook 的存储库中,然后将所有提交同步回 GitHub。Facebook 的基础设施与常见的持续集成服务不同,并非所有开源测试都在 Facebook 内部运行。这意味着同步到 GitHub 的提交经常会破坏开源测试,这需要花费大量时间来修复。
React Native 团队的 Héctor Ramos 在过去的两个月中花费了大量时间来改进 Facebook 和 GitHub 上的 React Native 持续集成系统。现在,大多数开源测试都在更改提交到 Facebook 的 React Native 之前运行,这将使 GitHub 上的 CI 在同步提交时保持稳定。
下一步
务必查看我们关于 React Native 未来的演讲!在接下来的几个月中,Facebook 的 React Native 团队成员将在 Chain React 和 React Native EU 上发表演讲。另外,请注意我们的下一个版本 0.60,它即将到来。这将令人兴奋 ✨