将 Hermes 作为默认引擎
去年十月,我们宣布我们已经开始着手将 Hermes 作为所有 React Native 应用的默认引擎。
Hermes 在 Meta 内部为 React Native 带来了很多价值,我们相信开源社区也将从中受益。Hermes 专为资源受限的设备设计,并针对启动速度、应用大小和内存消耗进行了优化。Hermes 与其他 JS 引擎的一个主要区别在于它能够提前将 JavaScript 源代码编译成字节码。这种预编译的字节码被打包到二进制文件中,从而避免了解释器在应用启动期间执行这一昂贵步骤。
自宣布以来,我们投入了大量工作来改进 Hermes,今天,我们很高兴地宣布 React Native 0.70 将默认搭载 Hermes 引擎。这意味着所有从 v0.70 开始的新项目将默认启用 Hermes。随着七月份的推出,我们希望与社区紧密合作,确保平稳过渡并为所有用户带来价值。这篇博文将介绍这项变化带来的预期内容、性能基准测试、新特性等。请注意,您无需等待 React Native 0.70 即可开始使用 Hermes - 您可以按照这些说明在现有 React Native 应用中启用 Hermes。
请注意,虽然 Hermes 将在新的 React Native 项目中默认启用,但对其他引擎的支持将继续保留。
性能基准测试
我们衡量了对应用开发者重要的三个不同指标:TTI、二进制大小和内存消耗。我们使用 React Native 应用 Mattermost 进行测试。我们在 2020 年的高端硬件上对 Android 和 iOS 进行了这些实验。
- TTI,即 Time To Interactive(可交互时间),是指从应用启动到用户能够与之交互的时间长度。对于此基准测试,我们将其定义为从按下应用图标到第一个屏幕渲染完成的时间。我们还展示了 Mattermost 启动过程的屏幕录像。
- 二进制大小衡量的是 Android 上的 APK 大小和 iOS 上的 IPA 大小。
- 内存消耗数据是通过使用 Mattermost 应用几分钟收集的。在两个引擎上,应用中执行了相同的操作。
Android 性能基准测试数据
所有 Android 测试均在 Samsung Galaxy S20 上进行。

TTI 视频

iOS 性能基准测试数据
所有 iOS 测试均在 iPhone 12 Pro 上进行。

TTI 视频

慢速 TTI 视频,以更好地展示启动时间差异。

React Native/Hermes 集成
我们解决了一个长期存在的问题,该问题导致兼容性问题,并且在发布新 React Native 版本时反复出现:React Native 通过通过 CocoaPods 和 npm 分发的预构建二进制文件依赖于 Hermes,这可能导致 API 或 ABI 不兼容。为了解决这个问题,从 React Native 0.69 开始,Hermes 与每个版本的 React Native 一起构建。这确保了与每个 React Native 版本的完全兼容性。这也创建了更紧密的集成。它缩短了开发功能或部署错误修复的迭代时间,并让我们更有信心确保 Hermes 的重大变更能够正确完成。有关新的集成变更的更多深入信息,请参见此处。
iOS Intl
我们完成了 ECMAScript 国际化 API Intl
的 iOS 对应实现,它提供了广泛的语言敏感功能。这是一个长期存在的空白,阻碍了一些开发者使用 Hermes。与微软合作完成的 Android 实现已在 React Native 0.65 中发布。借助 React Native 0.70,开发者将在两个平台上获得原生支持。
Intl
的典型实现需要导入大型查找表或像 Unicode CLDR 这样的数据。然而,这可能会导致高达 6MB 的昂贵大小增加,因此为了避免增加 Hermes 的二进制大小,我们通过调用 iOS 自身公开的 API 来实现 Intl
。这意味着我们可以利用 iOS 自带的所有区域设置和国际化数据。
正在进行的工作
随着我们不断发展 Hermes,我们希望让社区了解我们的近期优先事项:改进开发者体验,并确保没有人会因缺少 JavaScript 语言特性而避免使用 Hermes。更具体地说,我们正在进行以下工作:
- 使开发者能够直接从 Chrome DevTools UI 运行采样分析器。
- 添加对
BigInt
的支持,这是社区长期以来一直要求的,它可能会阻止一些开发者使用 Hermes,因为它无法 polyfill。 - 添加对
WeakRef
的支持,这将向开发者开放新的内存管理控制。
总结
Hermes 成为默认引擎标志着一个长期旅程的开始。我们正在开发新功能,使社区能够在未来多年编写高效的应用。我们还鼓励社区在我们的 GitHub 仓库上提出任何错误、问题、反馈或想法!我们创建了一个 hermes
标签,可用于任何与 Hermes 相关的帖子。