跳至主内容

Hermes 成为默认引擎

· 1 分钟阅读
Michael Leon
Michael Leon
Software Engineer @ Meta
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

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

Hermes 在 Meta 内部为 React Native 提供了巨大价值,我们相信开源社区同样能从中受益。Hermes 专为资源受限设备设计,针对启动速度、应用体积和内存消耗进行了优化。与其他 JS 引擎的关键区别在于其能够提前将 JavaScript 源代码编译为字节码。这些预编译的字节码会打包到二进制文件中,省去了解释器在应用启动时执行这一昂贵步骤的开销。

自公告发布以来,我们投入大量工作提升 Hermes 性能。今天,我们激动地宣布:React Native 0.70 将默认搭载 Hermes 引擎。这意味着所有基于 v0.70 的新项目都将默认启用 Hermes。随着七月版本发布临近,我们希望与社区紧密协作,确保过渡平稳并为所有用户创造价值。本文将详述此次变更带来的性能基准测试、新特性等内容。请注意,您无需等待 React Native 0.70 —— 现在即可按照指引在现有 React Native 应用中启用 Hermes

请注意,虽然新 React Native 项目将默认启用 Hermes,我们仍会持续支持其他引擎。

基准测试

我们测量了应用开发者关注的三大指标:TTI(可交互时间)、二进制体积和内存消耗。测试使用 React Native 应用 Mattermost,在 2020 年高端 Android 和 iOS 设备上运行。

  • TTI(可交互时间)指从应用启动到用户可进行操作的时间间隔。本次测试定义为点击应用图标到首屏渲染完成的时间。我们还提供了 Mattermost 启动过程的屏幕录像。

  • 二进制体积在 Android 上测量 APK 大小,iOS 上测量 IPA 大小。

  • 内存消耗数据通过在 Mattermost 应用中进行数分钟操作采集,确保在两种引擎上执行相同动作。

Android 基准测试数据

所有 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 通过 CocoaPods 和 npm 分发的预构建二进制文件依赖 Hermes,可能导致 API 或 ABI 不兼容。为解决此问题,从 React Native 0.69 开始,Hermes 将与每个 React Native 版本同步构建。这确保了与每个 React Native 版本的完全兼容性,同时实现了更紧密的集成。该方案缩短了功能开发或缺陷修复的迭代周期,并增强了我们对 Hermes 重大变更的信心。集成变更的深度解析可参阅此处

iOS Intl

我们已完成了iOS平台上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开发者工具界面运行采样分析器

  • 新增对BigInt的支持,这是社区长期期待的功能。由于该特性无法通过polyfill实现,当前缺失可能阻碍部分开发者采用Hermes

  • 新增对WeakRef的支持,这将为开发者提供新的内存管理控制能力

总结

Hermes成为默认引擎标志着一个长期旅程的开端。我们正在开发的新特性将帮助社区在未来多年持续构建高性能应用。同时诚邀开发者通过GitHub仓库提交错误报告、疑问、反馈或创意!我们已创建专用hermes标签用于相关讨论。