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