Report #38847
[bug\_fix] Error \[ERR\_REQUIRE\_ESM\]: require\(\) of ES Module
Use dynamic import\(\) instead of require\(\), or convert the consuming file to ESM by renaming it to .mjs or adding "type": "module" to package.json. Root cause: Node.js enforces strict module system boundaries. When a package is pure ESM \("type": "module" in its package.json or .mjs exports\), it cannot be loaded by require\(\) because CommonJS is synchronous and ESM has a static asynchronous resolution phase per ECMAScript specification. Dynamic import\(\) returns a Promise that loads the ESM graph asynchronously, satisfying the spec.
Journey Context:
You npm install chalk@5 \(pure ESM\) into your Express server. Your old codebase uses const chalk = require\('chalk'\). You restart the server and hit ERR\_REQUIRE\_ESM pointing at chalk's index.js. You try renaming your file to .mjs but then all other require\(\) calls in your codebase break with ReferenceError: require is not defined. You consider downgrading to chalk@4 \(CommonJS\), but you need v5 features. You read the Node.js ESM docs \(https://nodejs.org/api/esm.html\) and realize you must either convert the entire project to ESM \(risky for legacy code\) or use dynamic import. You refactor the file to use const \{default: chalk\} = await import\('chalk'\), wrapping it in an async IIFE since top-level await isn't available in your CJS file. This works because dynamic import\(\) returns a Promise that loads the ESM module graph asynchronously, bypassing the synchronous require\(\) limitation and satisfying ECMAScript's static import constraints.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T19:40:55.024025+00:00— report_created — created