Repository navigation
Reliance on require(esm) in the react-native-node-api-modules package may cause onboarding frictions #110
Description
Background
I ran into a problem with require(esm) when attempting to run pod install on a React Native iOS (Expo) app that depends on react-native-node-api-modules. It seems that although I'm running an LTS version of Node, only the more recent minor releases actually support that feature.
require(esm) is supported (without --experimental-require-module) from Node.js v22.12.0+ and v23.0.0+. Although v22 is in Active LTS, versions below 22.12.0 lack this feature, and although v22.13.0 has been available for half a year already, having come out in December 2024, there's a fair chance that users won't have it installed yet. I happened to be on Node.js v22.11.0, for example 😅
We might reduce onboarding frictions by avoiding require(esm) here.
Issue
The file packages/react-native-node-api-modules/src/node/cli/program.ts writes this ESM import in TypeScript:
import { SpawnFailure } from "bufout";Based on the config in packages/react-native-node-api-modules/tsconfig.node.json, this gets transpiled to CommonJS in packages/react-native-node-api-modules/dist/node/cli/program.js:
const bufout_1 = require("bufout");
// ... which later is accessed as `bufout_1.SpawnFailure`This leads to the following error upon running cd ios && pod install in the latest Expo template when Node v22.11.0 is on the shell's PATH.
[Expo] Enabling modular headers for pod React-hermes
/Users/jamie/Documents/git/react-native-node-api-modules/packages/react-native-node-api-modules/dist/node/cli/program.js:315
undefined
^
Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/jamie/Documents/git/react-native-node-api-modules/node_modules/bufout/dist/index.js from /Users/jamie/Documents/git/react-native-node-api-modules/packages/react-native-node-api-modules/dist/node/cli/program.js not supported.
Instead change the require of index.js in /Users/jamie/Documents/git/react-native-node-api-modules/packages/react-native-node-api-modules/dist/node/cli/program.js to a dynamic import() which is available in all CommonJS modules.
at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at Object.<anonymous> (/Users/jamie/Documents/git/react-native-node-api-modules/packages/react-native-node-api-modules/dist/node/cli/program.js:11:18) {
code: 'ERR_REQUIRE_ESM'
}
Node.js v22.11.0
[!] Invalid `Podfile` file:
[!] Invalid `react-native-node-api-modules.podspec` file: Hermes patching failed. Please check the output above for errors..
# from /Users/jamie/Documents/git/react-native-node-api-modules/node_modules/react-native-node-api-modules/react-native-node-api-modules.podspec:5
# -------------------------------------------
#
> require_relative "./scripts/patch-hermes"
#
# -------------------------------------------
.
# from /Users/jamie/Documents/git/react-native-node-api-modules/apps/expo-template/ios/Podfile:32
# -------------------------------------------
#
> config = use_native_modules!(config_command)
#
# -------------------------------------------
[!] !!! PATCHING HERMES WITH NODE-API SUPPORT !!!
In one screenshot:

Activity
kraenhansen commentedon Jul 2, 2025
Great observation.
A good start to soften the blow, would be to make this requirement on an updated Node.js reflected in the engines field.
huytdps13400 commentedon Aug 22, 2026
I opened #452 with an engine range derived from the current built artifact. The CommonJS CLI fails on Node 20.18.3, 21.7.3, and 22.11.0, but loads on 20.19.0 and 22.12.0, so the package now declares
>=20.19.0 <21 || >=22.12.0. This warns consumers before theERR_REQUIRE_ESMfailure while keeping the working Node 20 LTS line supported.kraenhansen commentedon Oct 11, 2026
@huytdps13400 thanks a lot for the PR, I've rebased the commit in #470 and consider this.
WDYT @shirakaba can we close this issue? 🤔