Skip to content

[0.87] Consolidate react-native/setup-env in Metro configs#57559

Open
huntie wants to merge 2 commits into
react:0.87-stablefrom
huntie:0.87-consolidate-setup-env
Open

[0.87] Consolidate react-native/setup-env in Metro configs#57559
huntie wants to merge 2 commits into
react:0.87-stablefrom
huntie:0.87-consolidate-setup-env

Conversation

@huntie

@huntie huntie commented Jul 15, 2026

Copy link
Copy Markdown
Member

Summary

Tidy ups following #57557.

Cause

Ultimately, a race condition on 0.87-stable from not having all of the following changes at once:

This PR aligns the branch state with main (and undoes #57557).

Test Plan

Template E2E (test_e2e_ios_templateapp / test_e2e_android_templateapp)

cipolleschi and others added 2 commits July 15, 2026 11:21
Summary:
react#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 react#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: react#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 (react#57475)

Reviewed By: cipolleschi

Differential Revision: D111226610

Pulled By: huntie

fbshipit-source-id: b44e82a248c1f2333c2ea85001c9f243b54619ad
@huntie huntie requested review from cipolleschi and zeyap July 15, 2026 10:28
@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 15, 2026
@github-actions

Copy link
Copy Markdown

Caution

Missing Changelog

Please add a Changelog to your PR description. See Changelog format

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. p: Facebook Partner: Facebook Partner Pick Request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants