使用 Hermes 引擎
编辑页面
在 Expo 项目中配置适用于 Android 和 iOS 的 Hermes 指南。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
Hermes 是一个为 React Native 优化的 JavaScript 引擎。通过提前将 JavaScript 编译为字节码,Hermes 可以提升应用的启动时间。Hermes 的二进制大小也比其他 JavaScript 引擎(例如 JavaScriptCore (JSC))更小。它在运行时还会使用更少的内存,这在较低端的 Android 设备上尤其有价值。
支持
Hermes 引擎是 Expo 默认使用的 JavaScript 引擎,并且在所有 Expo 工具中都得到完全支持。
在特定平台上切换 JavaScript 引擎
你可能希望在一个平台上使用 Hermes,而在另一个平台上使用 JSC。一种做法是在 app 配置的顶层将 "jsEngine" 设置为 "hermes",然后在 "ios" 键下将其覆盖为 "jsc"。在这种情况下,你也可以选择只在 "android" 键下显式设置 "hermes"。
{ "expo": { "jsEngine": "hermes", "ios": { "jsEngine": "jsc" } } }
发布更新
使用 eas update 和 npx expo export 发布更新时,将生成 Hermes 字节码包及其源映射。
请注意,不同 Hermes 版本之间 Hermes 字节码格式可能会发生变化——为某个特定 Hermes 版本生成的更新,无法在另一个 Hermes 版本上运行。从 Expo SDK 46(React Native 0.69)开始,Hermes 已内置于 React Native 中。更新 React Native 版本或 Hermes 版本,可以视为更新其他任何原生模块一样。因此,如果你更新了 react-native 版本,也应该在 app.json 中更新 runtimeVersion。如果不这样做,你的应用可能会在启动时崩溃,因为该更新可能会被现有二进制文件加载,而该二进制文件使用的是与更新后的字节码格式不兼容的旧版 Hermes。更多信息请参阅 runtimeVersion。
JavaScript 调试器
要调试在 Hermes 下运行的 JavaScript 代码,你可以使用 npx expo start 启动项目,然后按 j 在 Google Chrome 或 Microsoft Edge 中打开调试器。开发构建和 Expo Go 的开发者菜单中也有 Open DevTools(以前称为 Open JS Debugger)选项,可以实现相同功能。
或者,你也可以通过手动打开 Google Chrome DevTools 来使用 JavaScript 检查器
故障排查
打开调试器时提示No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine.。
-
确保你已在
jsEngine字段中设置 Hermes。 -
如果你的应用是通过
eas build、npx expo run:android或npx expo run:ios构建的,请确保它是调试构建。 -
在内部,应用会建立 WebSocket 连接,请确保你的应用已连接到开发服务器。
- 尝试在 Expo CLI 终端 UI 中按 r 重新加载应用。
- 通过运行以下命令测试调试可用性:
curl http://127.0.0.1:8081/json/list(将127.0.0.1:8081调整为与你的开发服务器 URL 匹配)。HTTP 响应应为数组,如下所示。如果返回空响应,请为npx expo start命令添加--localhost或--tunnel标志。
[ { "id": "0-2", "description": "host.exp.Exponent", "title": "Hermes ABI47_0_0React Native", "faviconUrl": "https://react.dev/favicon.ico", "devtoolsFrontendUrl": "devtools://devtools/bundled/js_app.html?experiments=true&v8only=true&ws=%5B%3A%3A1%5D%3A8081%2Finspector%2Fdebug%3Fdevice%3D0%26page%3D2", "type": "node", "webSocketDebuggerUrl": "ws://[::1]:8081/inspector/debug?device=0&page=2", "vm": "Hermes" }, { "id": "0--1", "description": "host.exp.Exponent", "title": "React Native Experimental (Improved Chrome Reloads)", "faviconUrl": "https://react.dev/favicon.ico", "devtoolsFrontendUrl": "devtools://devtools/bundled/js_app.html?experiments=true&v8only=true&ws=%5B%3A%3A1%5D%3A8081%2Finspector%2Fdebug%3Fdevice%3D0%26page%3D-1", "type": "node", "webSocketDebuggerUrl": "ws://[::1]:8081/inspector/debug?device=0&page=-1", "vm": "don't use" } ]
我可以在 Hermes 中使用远程调试吗?
远程调试 的众多限制之一是,它无法与构建在 JSI 之上的模块一起工作,例如 2 版或更高版本的 react-native-reanimated。
Hermes 支持 Chrome DevTools Protocol,可以通过连接到设备上运行的引擎来原地调试 JavaScript;而远程调试则是在桌面 Chrome 标签页中执行 JavaScript。你在 Expo Go 或开发构建中打开调试器时,Hermes 应用会自动使用这种调试技术。