跳到主要内容

Hermes 作为默认引擎

· 阅读需 5 分钟
Michael Leon
Michael Leon
Software Engineer @ Meta

去年十月,我们宣布开始着手将 Hermes 设为所有 React Native 应用的默认引擎。

Hermes 为 Meta 内部的 React Native 带来了巨大价值,我们相信开源社区也将从中受益。Hermes 设计用于资源受限的设备,针对启动速度、应用体积和内存消耗进行了优化。Hermes 与其他 JavaScript 引擎的一个关键区别是它能提前将 JavaScript 源代码编译为字节码。预编译的字节码会被打包进二进制文件,避免了解释器在应用启动时执行这一步昂贵操作。

自公告以来,我们投入了大量工作来改进 Hermes。今天,我们很高兴地宣布,React Native 0.70 将默认使用 Hermes 引擎。 这意味着从 v0.70 开始的新项目将默认启用 Hermes。随着 7 月的版本发布临近,我们希望与社区密切合作,确保过渡顺利并为所有用户带来价值。本文将介绍此次变更的预期效果、性能基准、主要新功能等。注意,你无需等待 React Native 0.70 就能开始使用 Hermes —— 你可以按照这份指南在现有 React Native 应用中启用 Hermes。

另外,尽管在新项目中 Hermes 将是默认选项,其他引擎的支持仍将继续。

性能测试​

我们衡量了对应用开发者至关重要的三项指标:TTI(可交互时间)、二进制体积和内存消耗。我们使用 React Native 应用 Mattermost 进行测试。测试涵盖了 Android 和 iOS,设备为 2020 年的高端机型。

  • TTI(time to interactive,可交互时间)是从应用启动到用户能够操作它所需的时间。在基准测试中定义为从点击应用图标到第一屏幕呈现的时间。我们同样提供了 Mattermost 启动的屏幕录制视频。
  • 二进制体积采用 Android 的 APK 大小和 iOS 的 IPA 大小进行衡量。
  • 内存消耗数据是在 Mattermost 应用中运行几分钟采集的,相同操作分别在两个引擎下执行。

Android 性能测试数据​

所有 Android 测试均在三星 Galaxy S20 上完成。

Android 基准测试数据

TTI 视频​

Android TTI 视频

iOS 性能测试数据​

所有 iOS 测试均在 iPhone 12 Pro 上完成。

iOS 基准测试数据

TTI 视频​

iOS TTI 视频

慢速播放 TTI 视频,更加清晰地展示启动时间差异。​

iOS 慢速播放 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 支持​

我们完成了 iOS 端对 Intl 的实现,Intl 是 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,这是一项社区长期请求的特性,因其无法通过 Polyfill 实现,影响部分开发者使用 Hermes。
  • 支持 WeakRef,为开发者开放新的内存管理控制权。

总结​

Hermes 成为默认引擎标志着一段长期旅程的开始。我们正致力于新的功能开发,助力社区在未来多年编写高效应用。我们也鼓励开发者在我们的GitHub 仓库上反馈任何错误、提出问题、分享建议或想法!我们已创建了一个 hermes 标签,方便针对 Hermes 相关内容的讨论。