React Native 开源进展更新:2019年6月
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
代码与社区健康
过去六个月中,超过 550 位贡献者为 React Native 提交了总计 2800 次代码提交。社区中的 400 位贡献者创建了超过 1,150 个 Pull Request,其中 820 个 Pull Request 已被合并。
尽管我们通过 Lean Core 计划将官网、CLI 和多个模块从 React Native 中拆分出来,过去六个月日均 Pull Request 数量仍从三个增至约六个。目前平均未处理 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。为多个组件补充缺失的无障碍角色,新增 API 为未来更好的 Web 支持奠定基础。
- 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 来完成 flow 类型原生模块的工作。除了前文提到的贡献者外,我们还要感谢 Michał Chudziak、Michał Pierzchała、Wojtek Szafraniec 和 Jean Regisser 等所有提交过 Pull Request 的贡献者。
-
Haste: 自 2015 年起,React Native 一直使用 “haste” 模块系统,该系统允许通过全局 ID 而非相对路径导入模块,这种方式虽然便捷但许多工具支持不佳。James Ide 提出移除 haste 模块系统(类似于多年前 React 的做法)。他通过一个总括任务规划了全部工作,并提交了 18 个 Pull Request 来实现这一目标!详情请参阅他的 Twitter 讨论串。
-
Android Fragments:John Shelley 提出的通过 Android Fragments 支持 React Native 的提案已合并,将在 0.61 版本中提供。了解更多关于 Android Fragments 的信息。
Lean Core
Lean Core 的主要目标是将模块从 React Native 中拆分到独立仓库,以便获得更好的维护。短短六个月内,WebView、NetInfo、AsyncStorage、官网 和 CLI 等仓库共接收了超过 800 个 Pull Request。除了更完善的维护外,这些项目还能比 React Native 本身更频繁地独立发布。
我们还借此机会从 React Native 核心移除了过时的 polyfill 和遗留组件。过去为了在旧版 JavaScriptCore (JSC) 中支持 Map 和 Set 等语言特性,polyfill 是必需的。随着 React Native 搭载新版 JSC,这些 polyfill 已被移除。
这项工作仍在进行中,原生和 JavaScript 端仍有大量内容需要拆分或移除,但已有初步迹象表明我们成功扭转了表面积和应用体积的增长趋势:以 JavaScript 包为例,约一年前的 0.54 版本中 React Native JavaScript 包大小为 530kb,六个月内增长到 0.57 版本的 607kb(增加 77kb)。如今在主分支上我们看到包大小减少 28kb 至 579kb,差值超过 100kb!
随着 Lean Core 首阶段工作告一段落,我们将更审慎地考虑新增 React Native API,持续探索减小体积、提升速度的方案,并寻找赋能社区接管各类组件的方法。
用户反馈
六个月前,我们曾向社区发起提问"您对React Native有哪些不满之处?",这让我们充分了解了开发者面临的痛点。数月前我们已作出初步回应,现在就来总结针对核心问题的改进进展:
-
版本升级: 社区共同推动了多项升级体验优化:自动链接、通过rn-diff-purge改进升级命令、即将上线的升级助手网站。我们还将通过发布每个主版本的博客文章,明确传达重大变更和重要新特性。这些改进将使0.60版本之后的升级过程显著简化。
-
支持/不确定性: 许多开发者曾因Pull Request处理延迟和Facebook对React Native投入的不确定性感到困扰。如上文数据所示,我们现在已准备好处理更多Pull Request,并热切期待您的提案与贡献!
-
性能: React Native 0.59搭载了速度大幅提升的新版JavaScriptCore(JSC)。我们同时优化了内联引用(inline-requires)的默认启用机制,未来数月还将带来更多性能优化。
-
文档: 我们已启动全面重构React Native文档的计划,非常欢迎您参与贡献!
-
Xcode警告: 我们已消除所有现有警告,并将严格避免引入新警告。
-
热重载: React团队正在构建新版热重载系统,即将集成至React Native。
但仍有部分问题尚未完全解决:
-
调试体验: 虽然修复了许多日常高频出现的缺陷,但调试体验改进仍未达预期。我们深知当前调试体验欠佳,后续将优先优化此环节。
-
Metro符号链接: 目前尚未实现简洁解决方案,但React Native用户已分享多种变通方案供您参考。
鉴于近半年的重大变革,我们再次向您提出相同问题:如果您正在使用最新版React Native并希望反馈建议,请参与新版“您对React Native有哪些不满之处?”讨论。
持续集成
Facebook采用先合并Pull Request至内部仓库,再同步到GitHub的工作流。其基础设施与常规CI服务存在差异,导致部分开源测试未在内部运行,同步到GitHub的提交常引发测试中断且修复耗时。
React Native团队成员Héctor Ramos历时两月优化了Facebook与GitHub的双端CI系统。现在绝大多数开源测试会在变更提交至Facebook仓库前执行,确保同步到GitHub时CI状态稳定。
下一步计划
请务必关注我们关于 React Native 未来的精彩演讲!未来几个月内,Facebook 的 React Native 核心团队成员将在 Chain React 和 React Native EU 大会上分享最新动态。同时请密切关注即将发布的下个版本 0.60 —— 这将是个激动人心的里程碑 ✨