$ the-wire · showcase
React Native fixes bridgeless ordering and commits dev-machine paths
By RepoJournal · Filed · About Meta
React Native's bridgeless runtime can now schedule buffered CallInvoker work before earlier module calls, and the `spm add` command no longer writes a developer's absolute hermesc path into the app project.
In bridgeless mode, native code reached JS through two paths that both ended in the RuntimeScheduler queue but arrived differently: `callFunctionOnModule` went through the instance's BufferedRuntimeExecutor, while the CallInvoker skipped the buffer entirely and went straight to `scheduleTask`. That let a CallInvoker task issued after a module call reach the runtime first, violating ordering. The fix routes CallInvoker work through the same buffer, so module calls and async CallInvoker work now execute in issue order [1].
`npx react-native spm add` used to write `HERMES_CLI_PATH` into the app's committed `project.pbxproj`, baking in the absolute path to `hermesc` from whichever machine ran the command. Every SwiftPM-converted app therefore committed one developer's disk layout. The CLI now stops setting it, since `react-native-xcode.sh` already resolves `hermesc` at build time through react-native's own dependency graph [2].
Two smaller correctness fixes shipped as well. The source-optimized codegen preset now triggers native component codegen even when valid Flow formatting puts a comment or whitespace between `codegenNativeComponent` and its type arguments; previously such calls bypassed codegen and emitted an ordinary runtime call. The check now uses the stable `codegenNativeComponent` reference [3]. And the React rust compiler preserves the RefValue source location across phi joins, so validation errors like "Cannot access ref value during render" point to the original `ref.current` access instead of the component's return line [4].
A DevTools test dependency was upgraded from chrome-devtools-mcp 1.3.0 to 1.8.0. The new version requires `pageId` for page-scoped CLI tools and rejects non-hex session ids, so the e2e now passes `pageId` and uses `crypto.randomUUID()` [5]. The change is scoped to the cdt-mcp e2e harness and does not affect runtime DevTools behavior.
Action items
- → If you use bridgeless and depend on CallInvoker ordering relative to module calls, pull in the fix and verify scheduled work order facebook/react-native [plan]
- → Re-run `npx react-native spm add` on SwiftPM-converted apps to drop the committed absolute HERMES_CLI_PATH facebook/react-native [plan]
- → Check that codegen runs for native components written with a comment before type arguments, and adjust formatting if the previous bypass affected you facebook/react-native [monitor]
- → Run the cdt-mcp e2e suite after the chrome-devtools-mcp 1.8.0 upgrade facebook/react [plan]
References
- [1] Buffer async CallInvoker work with module calls (#58313) ↗ facebook/react-native
- [2] stop baking an absolute HERMES_CLI_PATH into the app pbxproj (#58292) ↗ facebook/react-native
- [3] Run codegen for formatted native component calls (#58257) ↗ facebook/react-native
- [4] [rust-compiler] Preserve ref access location across phi joins ↗ facebook/react
- [5] [DevTools] Upgrade chrome-devtools-mcp to 1.8.0 in cdt-mcp e2e ↗ facebook/react