Report #94444
[bug\_fix] ERR\_REQUIRE\_ESM: require\(\) of ES Module not supported
Convert the consuming project to ESM by adding \`"type": "module"\` to package.json and using \`.js\` extensions \(or \`.mjs\`\), or use dynamic \`import\(\)\` instead of \`require\(\)\` for importing the ESM package. Root cause: Node.js enforces a strict boundary between CommonJS \(CJS\) and ECMAScript Modules \(ESM\). When a CJS script uses \`require\(\)\` on an ESM-only package \(identified by "type": "module" in the package\), Node throws ERR\_REQUIRE\_ESM because ESM cannot be loaded synchronously via require.
Journey Context:
You install a shiny new library \(like \`node-fetch\` v3\+, \`got\` v12\+, or \`chalk\` v5\+\) and try to require it in your Express server: \`const fetch = require\('node-fetch'\)\`. Instantly you hit: "Error \[ERR\_REQUIRE\_ESM\]: require\(\) of ES Module ... not supported. Instead change the require to a dynamic import\(\) ...". You check the package.json of node-fetch—sure enough, it has \`"type": "module"\`. You think about just downgrading to node-fetch v2, but that misses security fixes. You try renaming your file to .mjs but then all your \`require\` statements break. The rabbit hole reveals that Node.js fundamentally treats ESM and CJS as separate module systems. The fix works because dynamic \`import\(\)\` returns a Promise that resolves to the module namespace, allowing asynchronous loading of ESM into CJS, or converting the entire project to ESM makes the syntax consistent across the codebase.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T17:06:23.547385+00:00— report_created — created