Skip to content

Commit eb987ef

Browse files
cipolleschimeta-codesync[bot]
authored andcommitted
Keep react-native/setup-env reachable in the module graph (#57492)
Summary: #57475 pointed Metro's `getModulesRunBeforeMainModule` at `react-native/setup-env` (`src/setup-env.js`) instead of `InitializeCore`. But Metro's serializer only emits a run-before-main require for modules **already in the bundle graph** — see `getAppendScripts`: ```js const paths = [...options.runBeforeMainModule, entryPoint]; for (const path of paths) { if (modules.some(module => module.path === path)) { /* emit run stmt */ } } ``` Nothing imports `src/setup-env.js` at runtime, so it was silently dropped. The RN environment setup (`setUpDefaultReactNativeEnvironment`: `HMRClient`, timers, batched bridge, `AppRegistry` setup, …) then never ran before the app's main module, and the app **redboxed on launch**: ``` Error: Failed to call into JavaScript module method HMRClient.setup(). Module has not been registered as callable. Registered callable JavaScript modules (n = 1): AppRegistry. ``` This broke the **template E2E tests** on both iOS and Android — the app renders a redbox, so Maestro's `assertVisible: 'Welcome to React Native'` fails (the `test (…)` jobs are green only because the Maestro step runs with `continue-on-error: true`; the real failure surfaces via the retry chain and the `retry_2 / report` job). ## Fix Have the deprecated `InitializeCore` delegate to `'react-native/setup-env'` via a side-effectful `require`. `InitializeCore` is a guaranteed graph entry (renderer → `ReactNativePrivateInitializeCore` → `InitializeCore`), so this pulls `src/setup-env.js` into the graph, and `getModulesRunBeforeMainModule` runs it before the main module again. Behavior is unchanged: `setup-env` and `InitializeCore` both call the idempotent `setUpDefaultReactNativeEnvironment()`. This keeps #57475 move to `setup-env` intact rather than reverting it. ## Changelog: [General][Fixed] - Fix app failing to initialize (`HMRClient.setup()` redbox) because the environment setup module was dropped from the bundle Pull Request resolved: #57492 Test Plan: - Template E2E (`test_e2e_ios_templateapp` / `test_e2e_android_templateapp`) should pass: app launches and shows "Welcome to React Native" instead of the redbox. cc huntie (#57475) Reviewed By: cipolleschi Differential Revision: D111226610 Pulled By: huntie fbshipit-source-id: b44e82a248c1f2333c2ea85001c9f243b54619ad
1 parent 7d2ef78 commit eb987ef

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

packages/react-native/Libraries/Core/InitializeCore.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,11 @@
2727

2828
'use strict';
2929

30-
require('../../src/private/setup/setUpDefaultReactNativeEnvironment').default();
30+
// NOTE: This delegates to the `'react-native/setup-env'` entry point (rather
31+
// than calling `setUpDefaultReactNativeEnvironment` directly) so that
32+
// `src/setup-env.js` is pulled into the module graph. Metro's
33+
// `getModulesRunBeforeMainModule` only runs modules that are already part of
34+
// the bundle, and `InitializeCore` is a guaranteed graph entry (via
35+
// `ReactNativePrivateInitializeCore`). This keeps `'react-native/setup-env'`
36+
// reachable so it runs before the main module.
37+
require('../../src/setup-env');

0 commit comments

Comments
 (0)