跳到主要内容

Hermes 作为默认引擎

·阅读时长5分钟
Michael Leon
Michael Leon
Meta 软件工程师

去年十月,我们宣布我们已开始着手将 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 进行测试。我们对 Android 和 iOS 在 2020 年的高端硬件上运行了这些实验。

  • TTI,即交互时间,是指从应用程序启动到用户可以与之交互的时间。对于这个基准测试,我们将其定义为从按下应用程序图标到第一个屏幕渲染的时间。我们还展示了 Mattermost 启动的屏幕录像。
  • 二进制文件大小在 Android 上测量为 APK 大小,在 iOS 上测量为 IPA 大小。
  • 内存消耗数据是通过使用 Mattermost 应用程序几分钟收集的。在两个引擎的应用程序中执行了相同的操作。

Android 基准测试数据

所有安卓测试均在三星 Galaxy S20 上进行。

Android Benchmarking Data

TTI 视频

Android TTI Video

iOS 基准测试数据

所有 iOS 测试均在 iPhone 12 Pro 上进行。

iOS Benchmarking Data

TTI 视频

iOS TTI Video

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

iOS Slowed Down TTI Video

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。与微软合作完成的 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 仓库上提出任何 bug、问题、反馈或想法!我们创建了一个 hermes 标签,可用于任何 Hermes 相关帖子。