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,或称可交互时间,是指从应用启动到用户能够与之交互的时间长度。对于此基准测试,我们将其定义为从按下应用图标到渲染第一个屏幕的时间。我们还展示了 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
我们完成了 Intl
的 iOS 对等实现,ECMAScript 国际化 API 提供了广泛的语言敏感功能。这是一个长期存在的差距,它阻止了一些开发者使用 Hermes。与 Microsoft 合作完成的 Android 实现已在 React Native 0.65 中发布。在 React Native 0.70 中,开发者将在两个平台上都获得原生支持。
Intl
的典型实现需要导入大型查找表或数据,例如 Unicode CLDR。然而,这可能会导致高达 6MB 的二进制文件大小增加,因此为了避免 Hermes 的二进制文件大小膨胀,我们通过调用 iOS 本身公开的 API 实现了 Intl
。这意味着我们可以利用 iOS 本身附带的所有区域设置和国际化数据。
正在进行的工作
随着我们继续发展 Hermes,我们希望让社区了解我们当前的优先事项:改善开发者体验,并确保没有人因为缺少 JavaScript 语言功能而避免使用 Hermes。更具体地说,我们正在
- 使开发者能够直接从 Chrome 开发工具 UI 运行采样分析器。
- 添加对
BigInt
的支持,这是社区长期以来的一个请求,可能会阻止一些开发者使用 Hermes,因为它无法被 polyfill。 - 添加对
WeakRef
的支持,这将向开发者公开新的内存管理控件。
总结
Hermes 成为默认引擎标志着长期旅程的开始。我们正在开发新功能,这将使社区能够在未来多年内编写高效的应用。我们还鼓励社区在我们的 GitHub 仓库 上发布任何错误、问题、反馈或想法!我们创建了一个 hermes
标签,可用于任何特定于 Hermes 的帖子。