跳到主要内容

认识 Hermes,一个新的 JavaScript 引擎,针对 React Native 进行了优化

·2 分钟阅读
Rachel Nabors
Facebook 文档工程师

上周在 Chain React 大会上,我们宣布了 Hermes,这是我们在 Facebook 一直在开发的开源 JavaScript 引擎。它是一个小巧轻便的 JavaScript 引擎,针对在 Android 上运行 React Native 进行了优化。查看一下!

Hermes 通过减少内存使用率、减小下载大小以及缩短应用程序变得可用或“可交互时间”(TTI)所需的时间来提高 React Native 性能。

“当我们分析性能数据时,我们注意到 JavaScript 引擎本身是启动性能和下载大小的重要因素。有了这些数据,我们知道我们必须优化 JavaScript 在移动电话等更受限环境中的性能,而不是台式机或笔记本电脑。在探索其他选项后,我们构建了一个名为 Hermes 的新 JavaScript 引擎。它旨在提高应用程序性能,专注于我们的 React Native 应用程序,即使在内存有限、存储速度慢和计算能力降低的大众市场设备上也是如此。” —Hermes:一个针对移动应用程序优化的开源 JavaScript 引擎,从 React Native 开始

想立即开始使用吗?请务必查看我们在文档中关于在现有 React Native 应用程序中启用 Hermes 的新指南

Hermes 和 React Native 标志的插图,它们结合成一个有翼的愤怒,从一个孤独的、发光的、大概是安卓手机中,在崩溃的电风暴中升起。 Rachel Nabors 的插图

宣布 React Native 0.60

·5 分钟阅读
Ryan Turner
核心维护者和 React Native 开发者

经过数百位贡献者数月的辛勤工作,React Native 核心团队自豪地宣布发布 0.60 版本。此版本处理了 Android 和 iOS 平台的重大迁移,并且还解决了许多问题。这篇博客文章涵盖了该版本的亮点。但与往常一样,请参阅变更日志以获取更详细的信息。最后,感谢贡献者帮助我们实现这一里程碑!

关注可访问性

可访问性 API 进行了许多改进,例如 announceForAccessibility,以及对 roles操作支持标志等的改进。可访问性是一门复杂的科学,但我们希望这些改进使其更容易实现 A11Y。请务必查看 React Native 开源更新 2019 年 6 月,了解有关这些更改的更多详细信息。

全新的开始

React Native 的启动屏幕已更新!感谢众多贡献者帮助创建了新的 UI。这个新的“Hello World”将以更友好、更引人入胜的方式欢迎用户进入生态系统。

The new init screen helps developers get started from the get-go with resources and a good example

AndroidX 支持

AndroidX 是 Android 生态系统向前迈出的重要一步,旧的支持库工件正在被弃用。对于 0.60 版本,React Native 已迁移到 AndroidX。这是一个重大更改,您的原生代码和依赖项也需要迁移

通过此更改,React Native 应用程序将需要开始使用 AndroidX 本身。它们不能在一个应用程序中并排使用,因此所有应用程序代码和依赖项代码都需要使用其中之一。

matt-oakesdiscussions-and-proposals

虽然您自己的原生代码需要您自己迁移,但 @mikehardy@cawfree@m4tt72 构建了一个 名为“jetifier”的巧妙工具来修补您的 node_modules。库维护者将需要升级,但此工具为您提供了一个临时解决方案,同时让他们有时间发布 AndroidX 版本。因此,如果您发现与 AndroidX 迁移相关的错误,请尝试一下。

默认使用 CocoaPods

CocoaPods 现在是 React Native iOS 项目的一部分。如果您还没有这样做,请务必从现在开始使用 xcworkspace 文件打开 iOS 平台代码(提示:从根项目目录尝试 xed ios)。此外,内部包的 podspec 已更改,使其与 Xcode 项目兼容,这将有助于故障排除和调试。预计在升级到 0.60 时,您会对 Podfile 进行一些简单的更改,以带来这种令人兴奋的支持。请注意,我们意识到与 use_frameworks! 存在兼容性问题,并且我们正在跟踪一个包含解决方法和未来补丁的 问题

精简核心移除

WebViewNetInfo 之前已提取到单独的存储库中,在 0.60 版本中,我们已完成将它们从 React Native 存储库中迁移出来。此外,为了响应社区对新 App Store 政策的反馈,Geolocation 已被提取出来。如果您尚未完成迁移,请通过将依赖项添加到 react-native-webview@react-native-community/netinfo@react-native-community/geolocation 来完成迁移。如果您想要自动化解决方案,请考虑使用 rn-upgrade-deprecated-modules。自提取以来,维护者已对这些存储库进行了 100 多次提交,我们很高兴看到社区的支持!

原生模块现在自动链接

负责 React Native CLI 的团队对原生模块链接进行了重大改进,称为 自动链接!大多数情况下,不再需要使用 react-native link。同时,该团队全面改进了链接过程。请务必 react-native unlink 文档中提到的任何预先存在的依赖项。

升级助手

@lucasbento@pvinis@kelset@watadarkstar 构建了一个名为 Upgrade Helper 的出色工具,以简化升级过程。它可以帮助具有棕地应用程序或复杂自定义的 React Native 用户了解版本之间的变化。请查看更新的升级文档,并立即试用它,了解您的升级路径!

Upgrade Helper cleanly and easily shows the changes needed to migrate to a different version of React Native

给库维护者的注意事项

AndroidX 的更改几乎肯定需要更新您的库,因此请务必尽快包含支持。如果您还无法升级,请考虑使用 jetifier 检查您的库,以确认用户能够在构建时修补您的库。

查看 自动链接 文档以更新您的配置和自述文件。根据您库之前的集成方式,您可能还需要进行一些其他更改。查看 CLI 中的 依赖项 指南,了解如何定义您的依赖项接口。

感谢

虽然这些是我们指出的亮点,但还有许多其他令人兴奋的内容。要查看所有更新,请查看变更日志。与往常一样,请继续关注更多新闻。同时享受 0.60 版本!

React Native 开源更新 2019 年 6 月

·8 分钟阅读
Christoph Nakazawa
Christoph Nakazawa
Facebook 前工程师

代码和社区健康

在过去的六个月中,超过 550 位贡献者对 React Native 进行了总共 2800 次提交。来自社区的 400 位贡献者创建了超过 1,150 个拉取请求,其中 820 个拉取请求被合并。

即使我们通过精简核心工作将网站、CLI 和许多模块从 React Native 中分离出来,过去六个月中每天的平均拉取请求数量也从三个增加到大约六个。未完成的拉取请求的平均数量现在低于 25 个,我们通常会在数小时或数天内回复建议和评论。

有意义的社区贡献

我们想重点介绍一些我们认为很棒的近期贡献

精简核心

精简核心 的主要动机是将模块从 React Native 中分离出来,放入单独的存储库中,以便它们可以获得更好的维护。在短短六个月内,WebViewNetInfoAsyncStorage网站CLI 等存储库总共收到了 800 多个拉取请求。除了更好的维护之外,这些项目还可以比 React Native 本身更频繁地独立发布。

我们还借此机会从 React Native 本身中删除了过时的 polyfill 和旧版组件。过去需要 Polyfill 来支持旧版本 JavaScriptCore (JSC) 中的 MapSet 等语言功能。现在 React Native 随附新版本,这些 polyfill 已被删除。

这项工作仍在进行中,在原生和 JavaScript 方面,还有许多东西需要分离或删除,但早期迹象表明,我们设法扭转了增加表面积和应用程序大小的趋势:例如,查看 JavaScript 包,大约一年前在 0.54 版本中,React Native JavaScript 包大小为 530kb,并在短短 6 个月内增长到 0.57 版本的 607kb(+77kb)。现在我们看到包大小减少了 28kb,降至 master 上的 579kb,减少了 100kb 以上!

当我们结束精简核心工作的第一次迭代时,我们将努力更加有意识地添加新的 API 到 React Native,我们将不断评估使 React Native 更小、更快的方法,并找到使社区能够拥有各种组件所有权的方法。

用户反馈

六个月前,我们询问社区“您不喜欢 React Native 的什么?”,这很好地概述了人们面临的问题。我们 几个月前回复了帖子,现在是时候总结一下在首要问题上取得的进展了

  • 升级: React Native 社区团结起来,对升级体验进行了多项改进:自动链接,通过 rn-diff-purge 改进的升级命令,升级助手网站(即将推出)。我们还将确保通过发布每个主要版本的博客文章来传达重大更改和令人兴奋的新功能。许多这些改进将使 0.60 版本之后的未来升级变得更加容易。
  • 支持/不确定性: 许多人对拉取请求的缺乏活动以及 Facebook 对 React Native 的投资的普遍不确定性感到沮丧。正如我们在上面所展示的,我们可以自信地说,我们已准备好迎接更多的拉取请求,并且我们热切期待您的提案和贡献!
  • 性能: React Native 0.59 附带了一个新的、速度更快的 JavaScriptCore (JSC) 版本。另外,我们一直在努力使默认情况下更容易启用 inline-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 上的 CI 在同步提交时保持稳定。

下一步

请务必关注我们关于 React Native 未来的演讲!在接下来的几个月里,Facebook 的 React Native 团队成员将在 Chain ReactReact Native EU 上发表演讲。此外,请留意我们即将发布的 0.60 版本,它已近在咫尺。这将令人兴奋

F8 大会上的 React Native 和开源播客

·3 分钟阅读
Christoph Nakazawa
Christoph Nakazawa
Facebook 前工程师

本周,Eli WhiteF8 2019 上发表了关于 Facebook 的 Android 和 iOS 应用程序中 React Native 的演讲。我们很高兴分享我们在过去两年中的工作以及我们接下来的计划。

请在 Facebook 开发者网站上查看视频

F8 Talk about React Native

演讲亮点:

  • 在 2017 年和 2018 年,我们专注于 React Native 最大的产品 Facebook Marketplace。我们与 Marketplace 团队合作,以提高产品质量并增加用户愉悦感。目前,Marketplace 是 Facebook 应用程序中 Android 和 iOS 平台上质量最高的产品之一。
  • Marketplace 的性能也是一个巨大的挑战,尤其是在中端 Android 设备上。在过去一年中,我们将启动时间缩短了 50% 以上,并且还在不断改进!最大的改进正在构建到 React Native 中,并将于今年晚些时候提供给社区。
  • 我们有信心可以使用 React Native 构建 Facebook 所需的高质量和高性能应用程序。这种信心让我们能够投入更大的赌注,例如重新思考 React Native 的核心
  • Microsoft 支持并将 React Native 用于 Windows,使人们能够利用他们的专业知识和代码库来渲染到 Microsoft 的通用 Windows 平台。请关注下周的 Microsoft Build,收听他们更多地谈论此事

关于开源的 React Radio 播客

Eli 的演讲最后谈到了我们最近的开源工作。我们在三月份发布了关于我们进展的更新,最近 Nader DabitGant Laborde 邀请了 Christoph 在他们的播客节目 React Native Radio 中进行了一次关于 React Native 开源的聊天。

播客亮点:

  • 我们讨论了 Facebook 的 React Native 团队如何看待开源,以及我们如何为一个像 React Native 这样规模庞大的项目构建可持续发展的社区。
  • 我们正在按计划删除多个模块,这是 Lean Core 工作的一部分。自 WebView 和 React Native CLI 等许多模块被提取出来以来,它们已经收到了 100 多个 Pull Request。
  • 接下来,我们将专注于全面改进 React Native 网站和文档。敬请关注!

您很快就能在您最喜欢的播客应用程序中找到这一集,或者您可以在这里收听录音

发布 React Native 0.59

·6 分钟阅读
Ryan Turner
核心维护者和 React Native 开发者

欢迎来到 React Native 0.59 版本!这是又一个重大版本,包含 88 位贡献者的 644 次提交。贡献也以其他形式出现,因此感谢您维护 issue、培育社区以及向人们传授 React Native 知识。本月带来了一些备受期待的更改,我们希望您喜欢它们。

🎣 Hooks 来了

React Hooks 是此版本的一部分,它允许您在组件之间重用有状态逻辑。关于 hooks 有很多讨论,但如果您还没有听说过,请查看下面的一些精彩资源

务必在您的应用程序中尝试一下。我们希望您发现这种重用和我们一样令人兴奋。

📱 更新的 JSC 意味着性能提升和 Android 上的 64 位支持

React Native 使用 JSC (JavaScriptCore) 来驱动您的应用程序。Android 上的 JSC 已经过时几年了,这意味着许多现代 JavaScript 功能都不受支持。更糟糕的是,与 iOS 的现代 JSC 相比,它的性能较差。随着此版本的发布,这一切都将改变。

感谢 @DanielZlotin@dulmandakh@gengjiawen@kmagiera@kudo 的出色工作,JSC 已经赶上了过去几年的发展步伐。这带来了 64 位支持、现代 JavaScript 支持以及 巨大的性能改进。感谢他们使这个过程现在变得可维护,以便我们可以利用未来 WebKit 的改进,而无需进行如此多的繁琐工作,并感谢 Software Mansion 和 Expo 使这项工作成为可能。

💨 使用内联 requires 加快应用程序启动速度

我们希望帮助人们默认拥有高性能的 React Native 应用程序,并且正在努力将 Facebook 的优化措施引入社区。应用程序根据需要加载资源,而不是减慢启动速度。此功能称为“内联 requires”,因为它允许 Metro 识别要延迟加载的组件。具有深度和多样化组件架构的应用程序将看到最大的改进。

source of the metro.config.js file in the 0.59 template, demonstrating where to enable inlineRequires

我们需要社区告知我们它的工作原理,然后我们才能默认启用它。当您升级到 0.59 时,将有一个新的 metro.config.js 文件;将选项翻转为 true 并向我们提供您的反馈!阅读性能文档中有关内联 requires 的更多信息,以对您的应用程序进行基准测试。

🚅 Lean core 正在进行中

React Native 是一个庞大而复杂的项目,代码库也很复杂。这使得代码库对贡献者来说不太容易接近,难以测试,并且作为开发依赖项而言过于臃肿。Lean Core 是我们通过将代码迁移到单独的库以进行更好管理来解决这些问题的努力。在过去的几个版本中,已经看到了这方面的初步进展,但是让我们认真对待

您可能会注意到,其他组件现在已被正式弃用。这是个好消息,因为现在这些功能有所有者积极维护它们。请注意警告消息,并将这些功能迁移到新的库,因为它们将在未来的版本中删除。下面是一个表格,指示了组件、其状态以及您可以迁移到哪里使用。

组件已弃用?新家
AsyncStorage0.59@react-native-community/react-native-async-storage
ImageStore0.59expo-file-systemreact-native-fs
MaskedViewIOS0.59@react-native-community/react-native-masked-view
NetInfo0.59@react-native-community/react-native-netinfo
Slider0.59@react-native-community/react-native-slider
ViewPagerAndroid0.59@react-native-community/react-native-viewpager

在接下来的几个月中,将有更多组件遵循这条路径走向更精简的核心。我们正在寻求帮助——前往 lean core umbrella 来参与进来。

👩🏽‍💻 CLI 改进

React Native 的命令行工具是开发人员进入生态系统的入口点,但它们长期存在问题,并且缺乏官方支持。CLI 工具已迁移到新存储库,并且专门的维护人员小组已经做出了一些令人兴奋的改进。

日志现在的格式更好。命令现在几乎可以立即运行——您会立即注意到差异

0.58's CLI is slow to start0.58's CLI is nearly instantaneous

🚀 升级到 0.59

我们听到了您关于 React Native 升级过程的反馈,我们正在采取措施改进 未来版本的体验。要升级到 0.59,我们建议使用 rn-diff-purge 来确定您当前的 React Native 版本和 0.59 之间发生了哪些更改,然后手动应用这些更改。将您的项目升级到 0.59 后,您将能够使用新改进的 react-native upgrade 命令(基于 rn-diff-purge!)升级到 0.60 及更高版本,随着新版本的发布。

🔨 破坏性更改

0.59 中的 Android 支持已根据 Google 的最新建议进行了清理,这可能会导致现有应用程序的潜在破坏。此问题可能会表现为运行时崩溃和消息“您需要将 Theme.AppCompat 主题(或后代)与此 activity 一起使用”。我们建议更新项目的 AndroidManifest.xml 文件,确保 android:theme 值是 AppCompat 主题(例如 @style/Theme.AppCompat.Light.NoActionBar)。

react-native-git-upgrade 命令已在 0.59 中删除,取而代之的是新改进的 react-native upgrade 命令。

🤗 感谢

许多新的贡献者帮助 从 flow 类型生成原生代码解决 Xcode 警告 - 这些是了解 React Native 如何工作并为更大的利益做出贡献的好方法。谢谢!请留意未来类似的 issue。

虽然这些是我们注意到的亮点,但还有许多其他令人兴奋的内容。要查看所有更新,请查看更新日志。0.59 是一个巨大的版本——我们迫不及待地想让您试用它。

我们将在今年余下的时间里推出更多改进。敬请关注!

Ryan 和整个 React Native 核心团队

React Native 开源更新 2019 年 3 月

·5 分钟阅读
Christoph Nakazawa
Christoph Nakazawa
Facebook 前工程师

我们宣布了我们在 2018 年第四季度发布的 React Native 开源路线图,此前我们决定加大对 React Native 开源社区的投入。

对于我们的第一个里程碑,我们专注于识别和改进社区中最显而易见的方面。我们的目标是减少未完成的 pull request、减少项目的表面积、识别主要用户问题以及建立社区管理指南。

在过去的两个月中,我们取得的进展超出了我们的预期。请继续阅读以了解更多详细信息

Pull Requests

为了建立一个健康的社区,我们必须快速响应代码贡献。在过去的几年中,我们降低了审查社区贡献的优先级,并积累了 280 个 pull request(2018 年 12 月)。在第一个里程碑中,我们将未完成的 pull request 数量减少到约 65 个。与此同时,每天打开的 pull request 的平均数量从 3.5 个增加到 7 个,这意味着在过去的三个月中,我们处理了大约 600 个 pull request

我们合并了几乎三分之二的 pull request,并关闭了三分之一。如果 pull request 过时或质量不高,或者不必要地增加了项目的表面积,则会在未合并的情况下关闭它们。大多数合并的 pull request 修复了错误、改进了跨平台奇偶校验或引入了新功能。值得注意的贡献包括提高类型安全性和支持 AndroidX 的持续工作。

在 Facebook,我们从 master 分支运行 React Native,因此我们在所有更改进入 React Native Release 之前都会先进行测试。在所有合并的 pull request 中,只有六个引起了问题:四个仅影响内部开发,两个在候选发布状态下被捕获。

更明显的社区贡献之一是更新的“RedBox”屏幕。这是一个很好的例子,说明社区如何使开发者体验更加友好。

精简核心

React Native 目前具有非常广泛的表面积,其中许多未维护的抽象概念我们在 Facebook 中并没有大量使用。我们正在努力减少表面积,以使 React Native 更小,并允许社区更好地维护 Facebook 中主要未使用的抽象概念。

在第一个里程碑中,我们请求社区帮助 Lean Core 项目。反响非常热烈,我们几乎无法跟上所有的进展。查看不到一个月内完成的所有工作

我们最兴奋的是,维护人员已经开始修复长期存在的问题、添加测试和支持长期请求的功能。这些模块获得的支持比以往在 React Native 中获得的更多,这表明这对社区来说是重要的一步。此类项目的示例包括 WebView,自提取以来,它已经收到了许多 pull request,以及 CLI,它现在由社区成员维护,并获得了急需的改进和修复。

主要用户问题

在 12 月,我们询问社区他们不喜欢 React Native 的地方。我们汇总了回复,并回复了每一个问题。幸运的是,我们社区面临的许多问题也是 Facebook 的问题。在我们的下一个里程碑中,我们计划解决一些主要问题。

投票最多的问题之一是升级到较新版本的 React Native 的开发者体验。不幸的是,这不是我们自己会遇到的问题,因为我们从 master 分支运行 React Native。值得庆幸的是,社区成员已经站出来解决这个问题

0.59 版本

如果没有 React Native 社区的帮助,特别是 Mike GrabowskiLorenzo Sciandra,我们将无法发布版本。我们希望改进发布管理流程,并计划从现在开始更多地参与其中

  • 我们将与社区成员合作,为每个主要版本创建一篇博客文章。
  • 当人们升级到新版本时,我们将在 CLI 中直接显示破坏性更改。
  • 我们将缩短发布版本所需的时间。我们正在探索增加自动化测试的方法,并制定改进的手动测试计划。

这些计划中的许多都将纳入即将发布的 React Native 0.59 版本中。0.59 将附带 React Hooks、用于 Android 的新的 64 位 JavaScriptCore 版本以及许多性能和功能改进。它目前作为候选发布版本发布,预计将在未来两周内稳定下来。

下一步

在接下来的两个月中,我们将继续管理 pull request 以保持进度,同时开始减少未完成的 GitHub issue 的数量。我们将通过 Lean Core 项目继续减少 React Native 的表面积。我们计划解决社区最关心的 5 个问题。在我们完成社区指南后,我们将把注意力转向我们的网站和文档。

我们非常高兴在三月份在 Facebook 伦敦接待来自我们社区的十多位贡献者,以帮助推动其中几项工作。我们很高兴您正在使用 React Native,并希望您能看到和感受到我们在 2019 年正在进行的改进。我们将在几个月后再次发布更新,并且将在此期间合并您的 pull request! ⚛️✌️

2018 年 React Native 社区状况

·4 分钟阅读
Lorenzo Sciandra
核心维护者和 React Native 开发者

在 2018 年,React Native 社区对我们开发和沟通 React Native 的方式进行了一些更改。我们相信,几年后,当我们回首往事时,会发现这种转变是 React Native 的转折点。

很多人对 React Native 架构的重写感到兴奋,即广为人知的 Fabric。除此之外,这将修复 React Native 架构中的基本限制,并为 React Native 未来的成功奠定基础,同时还有 JSI 和 TurboModules

2018 年最大的转变是赋予 React Native 社区权力。从一开始,Facebook 就鼓励来自世界各地的开发人员参与 React Native 的开源项目。从那时起,涌现出许多核心贡献者来处理发布过程等事务。

这些成员采取了一些实质性步骤,通过以下资源使整个社区更有能力塑造该项目的未来

react-native-releases 📬

该存储库于 1 月份创建,具有双重目的,既允许每个人以更协作的方式跟上新版本,又开启了关于某个版本中将包含哪些内容以及谁想建议 cherry-pick 的对话(例如 0.57.8 及其所有先前版本)。

这是推动我们摆脱每月发布周期以及目前用于 0.57.x 版本的“长期支持”方法的驱动力。

达到这些决策的一半功劳归功于今年创建的另一个存储库

discussions-and-proposals 🗣

该存储库于 7 月份创建,扩展了为 React Native 上的对话提供更开放环境的想法。以前,这种需求是通过主存储库中标记为 For Discussion 的 issue 来处理的,但我们希望将此策略扩展到其他库(例如 React)具有的 RFC 方法。

该实验立即在 React Native 生命周期中找到了自己的角色。Facebook 团队现在正在使用社区 RFC 流程来讨论可以在 React Native 中改进的内容,并协调围绕 Lean Core 项目 的工作——以及其他有趣的讨论。

@ReactNativeComm 🐣

我们意识到,我们沟通这些努力的方式并不像我们希望的那样有效,为了让大家更轻松地跟上 React Native 社区中发生的一切(从发布到积极的讨论),我们创建了一个新的 Twitter 帐户,您可以依靠 @ReactNativeComm

如果您不在该社交网络上,请记住您始终可以通过 GitHub 观看存储库;此功能在过去几个月中得到了改进,可以仅针对发布版本收到通知,因此您无论如何都应该考虑使用它。

未来的展望 🎓

在过去的 7-8 个月中,核心贡献者增强了 React Native Community GitHub 组织,以便在 React Native 的开发中承担更多所有权,并加强与 Facebook 的协作。但这始终缺乏类似项目可能拥有的正式结构。

该组织可以为更大的开发者社区中的每个人树立榜样,为其中托管的所有软件包/存储库实施一套标准,为维护人员提供一个互相帮助和贡献符合社区商定标准的优质代码的场所。

在 2019 年初,我们将制定这套新的指导方针。请在专门的讨论中告诉我们您的想法。

我们相信,通过这些改变,社区将变得更具协作性,以便当我们达到 1.0 版本时,我们将继续通过利用这种共同努力来编写(更多)出色的应用程序 🤗


我希望您和我们一样对这个社区的未来感到兴奋。我们很高兴看到你们所有人参与到上面列出的存储库中发生的对话中,或者通过你们将产生的出色代码参与进来。

祝您编码愉快!

开源路线图

·5 分钟阅读
Héctor Ramos
Facebook 工程师

今年,React Native 团队专注于大规模的 React Native 架构重构。正如 Sophie 在她的React Native 2018 状态文章中提到的那样,我们已经勾勒出一个计划,以更好地支持 Facebook 之外蓬勃发展的 React Native 用户和协作者群体。现在是时候分享更多关于我们一直在做的工作的细节了。在这样做之前,我想阐述我们对 React Native 开源的长期愿景。

我们对 React Native 的愿景是...

  • 一个健康的 GitHub 存储库。 Issue 和 pull request 在合理的时间段内得到处理。
    • 增加测试覆盖率。
    • 从 Facebook 代码存储库同步输出的提交不应破坏开源测试。
    • 更高规模的有意义的社区贡献。
  • 稳定的 API, 使与开源依赖项的接口更容易。
    • Facebook 使用与开源相同的公共 API
    • 遵循语义版本控制的 React Native 版本发布。
  • 一个充满活力的生态系统。 由社区维护的高质量 ViewManager、原生模块和多平台支持。
  • 优秀的文档。 专注于帮助用户创建高质量的体验,以及最新的 API 参考文档。

我们已确定以下重点领域,以帮助我们实现这一愿景。

✂️ Lean Core

我们的目标是通过删除非核心和未使用的组件来减少 React Native 的表面积。我们将把非核心组件转移到社区,以使其能够更快地发展。减少的表面积将使管理对 React Native 的贡献更容易。

WebView 是我们转移到社区的组件的一个例子。我们正在开发一个工作流程,该工作流程将允许内部团队在我们将这些组件从存储库中删除后继续使用它们。我们已经确定了数十个更多组件,我们将把这些组件的所有权交给社区。

🎁 开源内部组件和 🛠更新的工具

Facebook 产品团队的 React Native 开发体验可能与开源有所不同。在开源社区中流行的工具在 Facebook 中并不使用。可能有一种内部工具可以实现相同的目的。在某些情况下,Facebook 团队已经习惯了 Facebook 之外不存在的工具。当我们开源我们即将推出的架构工作时,这些差异可能会带来挑战。

我们将努力发布其中一些内部工具。我们还将改进对开源社区中流行工具的支持。以下是我们将要解决的项目的非详尽列表

  • 开源 JSI 并使社区能够引入他们自己的 JavaScript VM,以替换 RN 初始版本中的现有 JavaScriptCore。我们将在以后的文章中介绍 JSI 是什么,同时您可以从 Parashuram 在 React Conf 上的演讲中了解更多关于 JSI 的信息。
  • 支持 Android 上的 64 位库。
  • 在新架构下启用调试。
  • 改进对 CocoaPods、Gradle、Maven 和新 Xcode 构建系统的支持。

✅ 测试基础设施

当 Facebook 工程师发布代码时,如果代码通过所有测试,则认为可以安全地提交。这些测试会识别更改是否可能会破坏我们自己的 React Native 表面。然而,Facebook 使用 React Native 的方式存在差异。这使得我们有可能在不知不觉中破坏开源中的 React Native。

我们将加强我们的内部测试,以确保它们在尽可能接近开源的环境中运行。这将有助于防止破坏这些测试的代码进入开源。我们还将致力于基础设施,以实现对 GitHub 上核心存储库的更好测试,从而使未来的 pull request 能够轻松地包含测试。

与减少的表面积相结合,这将使贡献者能够更快、更有信心地合并 pull request。

📜 公共 API

Facebook 将通过公共 API 使用 React Native,就像开源一样,以减少意外的破坏性更改。我们已经开始转换内部调用站点来解决这个问题。我们的目标是收敛到一个稳定的公共 API,从而在 1.0 版本中采用语义版本控制。

📣 沟通

React Native 是 GitHub 上贡献者数量最多的顶级开源项目之一。这让我们非常高兴,我们希望继续保持下去。我们将继续致力于促进贡献者参与的倡议,例如提高透明度和公开讨论。文档是新接触 React Native 的人首先会遇到的东西之一,但它一直不是优先事项。我们希望解决这个问题,首先是恢复自动生成的 API 参考文档,创建更多专注于创建高质量用户体验的内容,并改进我们的版本说明

时间线

我们计划在接下来的一年左右的时间内完成这些项目。其中一些工作已经在进行中,例如 JSI,它已经在开源中落地。其他一些项目则需要更长的时间才能完成,例如减少表面积。我们将尽力向社区及时更新我们的进展。请加入我们的 Discussions and Proposals 仓库,这是 React Native 社区发起的一项倡议,它促成了本路线图中讨论的几个倡议的诞生。

引入新的 iOS WebViews

·2 分钟阅读
Facebook 软件工程师

长期以来,Apple 一直不鼓励使用 UIWebView,而是推荐使用 WKWebView。在即将发布的 iOS 12 中,UIWebView 将被正式弃用。React Native 的 iOS WebView 实现严重依赖 UIWebView 类。因此,鉴于这些发展,我们为 WebView React Native 组件构建了一个新的原生 iOS 后端,该后端使用 WKWebView。

这些更改的最后部分已在 此提交 中落地,并将在 0.57 版本中提供。

要选择加入此新实现,请使用 useWebKit 属性

<WebView
useWebKit={true}
source={{url: 'https://www.google.com'}}
/>

改进

UIWebView 没有合法的途径来促进 WebView 中运行的 JavaScript 和 React Native 之间的通信。当消息从 WebView 发送时,我们依赖一种 hack 方法将其传递到 React Native。简而言之,我们将消息数据编码到一个带有特殊 scheme 的 URL 中,并将 WebView 导航到该 URL。在原生端,我们拦截并取消此导航,从 URL 中解析数据,最后调用 React Native。这种实现方式容易出错且不安全。我很高兴地宣布,我们已经利用 WKWebView 的功能完全替换了它。

WKWebView 相对于 UIWebView 的其他优势包括更快的 JavaScript 执行速度和多进程架构。有关更多详细信息,请参阅此 2014 年 WWDC

注意事项

如果你的组件使用以下属性,那么在切换到 WKWebView 时可能会遇到问题。目前,我们建议你避免使用这些属性

行为不一致

automaticallyAdjustContentInsetscontentInsets (commit)

当你向 WKWebView 添加 contentInsets 时,它不会更改 WKWebView 的视口。视口大小与 frame 保持相同。使用 UIWebView,视口大小实际上会改变(如果内容插页为正值,则会变小)。

backgroundColor (commit)

使用 WebView 的新 iOS 实现,如果你使用此属性,你的背景颜色可能会闪烁显示。此外,WKWebView 渲染透明背景的方式与 UIWebview 不同。请查看 commit 描述以获取更多详细信息。

不支持

scalesPageToFit (commit)

WKWebView 不支持 scalesPageToFit 属性,因此我们无法在 WebView React Native 组件上实现此功能。

可访问性 API 更新

·7 分钟阅读
Ziqi Chen
加州大学伯克利分校学生

动机

随着技术的进步和移动应用程序在日常生活中的重要性日益增加,创建无障碍应用程序的必要性也日益重要。

React Native 有限的 Accessibility API 一直是开发人员的巨大痛点,因此我们对 Accessibility API 进行了一些更新,以使其更容易创建包容性的移动应用程序。

现有 API 的问题

问题一:两个完全不同但相似的属性 - accessibilityComponentType (Android) 和 accessibilityTraits (iOS)

accessibilityComponentTypeaccessibilityTraits 是两个属性,用于告诉 Android 上的 TalkBack 和 iOS 上的 VoiceOver 用户正在与哪种 UI 元素进行交互。这两个属性最大的问题是

  1. 它们是两个不同的属性,用法也不同,但目的相同。 在之前的 API 中,它们是两个独立的属性(每个平台一个),这不仅不方便,而且对许多开发人员来说也很困惑。iOS 上的 accessibilityTraits 允许 17 个不同的值,而 Android 上的 accessibilityComponentType 仅允许 4 个值。此外,这些值在很大程度上没有重叠。甚至这两个属性的输入类型也不同。accessibilityTraits 允许传入 traits 数组或单个 trait,而 accessibilityComponentType 仅允许单个值。
  2. Android 上的功能非常有限。 使用旧属性,Talkback 能够识别的唯一 UI 元素是“button”、“radiobutton_checked”和“radiobutton_unchecked”。

问题二:不存在 Accessibility Hints:

Accessibility Hints 帮助使用 TalkBack 或 VoiceOver 的用户了解当他们在 accessibility 元素上执行操作时会发生什么,而这些操作仅凭 accessibility label 是不明显的。这些提示可以在设置面板中打开和关闭。以前,React Native 的 API 完全不支持 accessibility hints。

问题三:忽略反转颜色:

一些有视力障碍的用户在其手机上使用反转颜色以获得更高的屏幕对比度。Apple 为 iOS 提供了一个 API,允许开发人员忽略某些视图。这样,当用户开启反转颜色设置时,图像和视频就不会失真。React Native 目前不支持此 API。

新 API 的设计

解决方案一:合并 accessibilityComponentType (Android) 和 accessibilityTraits (iOS)

为了解决 accessibilityComponentTypeaccessibilityTraits 之间的混淆,我们决定将它们合并为一个属性。这是有道理的,因为它们在技术上具有相同的预期功能,并且通过合并它们,开发人员在构建 accessibility 功能时不再需要担心平台特定的复杂性。

背景

在 iOS 上,UIAccessibilityTraits 是一个可以设置在任何 NSObject 上的属性。通过 javascript 属性传递到原生的 17 个 traits 中的每一个都映射到 Objective-C 中的 UIAccessibilityTraits 元素。Traits 各自用一个 long int 表示,并且每个设置的 trait 都通过 OR 运算组合在一起。

然而,在 Android 上,AccessibilityComponentType 是 React Native 创造的一个概念,并不直接映射到 Android 中的任何属性。Accessibility 由 accessibility delegate 处理。每个视图都有一个默认的 accessibility delegate。如果你想自定义任何 accessibility 操作,你必须创建一个新的 accessibility delegate,覆盖你想自定义的特定方法,然后将你要处理的视图的 accessibility delegate 设置为与新的 delegate 关联。当开发人员设置 AccessibilityComponentType 时,原生代码会基于传入的组件创建一个新的 delegate,并将视图设置为具有该 accessibility delegate。

所做的更改

对于我们的新属性,我们希望创建这两个属性的超集。我们决定将新属性主要模仿现有属性 accessibilityTraits 进行建模,因为 accessibilityTraits 具有明显更多的值。Android 上这些 traits 的功能将通过修改 Accessibility Delegate 来进行 polyfill。

accessibilityTraits 在 iOS 上可以设置为 17 个 UIAccessibilityTraits 值。但是,我们并没有将所有这些值都包含为新属性的可能值。这是因为设置其中一些 traits 的效果实际上不是很为人所知,并且这些值中的许多值实际上从未使用过。

UIAccessibilityTraits 的值通常用于两种目的之一。它们要么描述 UI 元素具有的角色,要么描述 UI 元素所处的状态。我们观察到之前属性的大多数用途通常使用一个代表角色的值,并将其与“state selected”、“state disabled”或两者结合使用。因此,我们决定创建两个新的 accessibility 属性:accessibilityRoleaccessibilityState

accessibilityRole

新属性 accessibilityRole 用于告诉 Talkback 或 Voiceover UI 元素的角色。这个新属性可以采用以下值之一

  • none
  • button
  • link
  • search
  • image
  • keyboardkey
  • text
  • adjustable
  • header
  • summary
  • imagebutton

此属性仅允许传入一个值,因为 UI 元素通常在逻辑上不会承担多个角色。例外情况是 image 和 button,因此我们添加了一个角色 imagebutton,它是两者的组合。

accessibilityStates

新属性 accessibilityStates 用于告诉 Talkback 或 Voiceover UI 元素所处的状态。此属性采用包含以下一个或两个值的数组

  • selected
  • disabled

解决方案二:添加 Accessibility Hints

为此,我们添加了一个新属性 accessibilityHint。设置此属性将允许 Talkback 或 Voiceover 向用户朗读 hint。

accessibilityHint

此属性以 String 的形式接收要读取的 accessibility hint。

在 iOS 上,设置此属性会将相应的原生属性 AccessibilityHint 设置到视图上。如果 iPhone 中启用了 Accessibility Hints,则 Voiceover 将读取该 hint。

在 Android 上,设置此属性会将 hint 的值附加到 accessibility label 的末尾。这种实现的优点是它模仿了 iOS 上 hints 的行为,但这种实现的缺点是这些 hints 无法像在 iOS 上那样在 Android 的设置中关闭。

我们在 Android 上做出此决定的原因是,通常,accessibility hints 与特定操作(例如,click)相对应,并且我们希望保持跨平台行为的一致性。

问题三的解决方案

accessibilityIgnoresInvertColors

我们将 Apple 的 api AccessibilityIgnoresInvertColors 公开给 JavaScript,因此现在当你的视图中不想反转颜色(例如图像)时,你可以将此属性设置为 true,它就不会被反转。

新用法

这些新属性将在 React Native 0.57 版本中提供。

如何升级

如果你目前正在使用 accessibilityComponentTypeaccessibilityTraits,以下是你升级到新属性可以采取的步骤。

1. 使用 jscodeshift

最简单的用例可以通过运行 jscodeshift 脚本来替换。

这个 脚本 替换了以下实例

accessibilityTraits=“trait”
accessibilityTraits={[“trait”]}

使用

accessibilityRole= “trait”

此脚本还移除了 AccessibilityComponentType 的实例(假设你在任何设置 AccessibilityComponentType 的地方,也会设置 AccessibilityTraits)。

2. 使用手动 codemod

对于使用 AccessibilityTraits 但没有 AccessibilityRole 对应值的情况,以及将多个 traits 传递到 AccessibilityTraits 的情况,必须手动完成 codemod。

一般来说,

accessibilityTraits= {[“button”, “selected”]}

将手动替换为

accessibilityRole=“button”
accessibilityStates={[“selected”]}

这些属性已经在 Facebook 的代码库中使用。Facebook 的 codemod 非常简单。jscodeshift 脚本修复了我们大约一半的实例,另一半是手动修复的。总的来说,整个过程花费不到几个小时。

希望你发现更新后的 API 有用!并请继续制作无障碍应用程序!#inclusion