Hermes 成为默认引擎
本页面由 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 进行。

TTI 视频

iOS 基准测试数据
所有 iOS 测试均在 iPhone 12 Pro 进行。

TTI 视频

慢放版 TTI 视频(更清晰展示启动时间差异)

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标签用于相关讨论。
