跳至主要内容

Hermes 成为默认引擎

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

去年 10 月,我们宣布 我们已开始着手 **将 Hermes 打造为所有 React Native 应用的默认引擎**。

Hermes 为 Meta 内部 React Native 带来了许多价值,我们相信开源社区也将从中受益。Hermes 专为资源受限的设备设计,并针对启动速度、应用大小和内存消耗进行了优化。Hermes 与其他 JS 引擎的一个关键区别在于它能够提前将 JavaScript 源代码编译为字节码。此预编译的字节码捆绑在二进制文件中,从而使解释器无需在应用启动期间执行此耗时的步骤。

自宣布以来,我们投入了大量工作来改进 Hermes,今天,我们很高兴地宣布 **React Native 0.70 将以 Hermes 作为默认引擎发布**。这意味着所有从 v0.70 开始的新项目都将默认启用 Hermes。随着 7 月份的推广即将到来,我们希望与社区紧密合作,确保过渡顺利,并为所有用户带来价值。这篇博文将介绍您对更改、性能基准、新功能等的期望。请注意,您无需等到 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 上执行。

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(提供广泛的语言敏感功能的 ECMAScript 国际化 API)的 iOS 对应实现。这是一个长期存在的差距,阻止了一些开发者使用 Hermes。Android 实现(与 Microsoft 合作完成)已在 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 成为默认 JavaScript 引擎标志着 React Native 长期发展旅程的开始。我们正在开发新的功能,以便社区能够在未来许多年内编写高效的应用。我们也鼓励社区在我们的 GitHub 仓库 上发布任何 bug、问题、反馈或想法!我们创建了一个 hermes 标签,可用于任何与 Hermes 相关的帖子。