gotchaModeratepending
Node.js require vs import -- mixing module systems
Viewed 0 times
require vs importESMCJStype moduleimport.metacreateRequire__dirname
nodejs
Error Messages
Problem
Cannot use require() in ESM files or import in CJS files. Mixing module systems causes confusing errors. __dirname and __filename are undefined in ESM.
Solution
Choose one system per file. CJS uses require/module.exports. ESM uses import/export. In ESM: (1) Set 'type': 'module' in package.json for .js files. (2) Use .mjs extension for individual ESM files. (3) __dirname replacement: import.meta.dirname (Node 21+) or new URL('.', import.meta.url). (4) require in ESM: use createRequire(import.meta.url). (5) Dynamic import: import() works in both CJS and ESM.
Why
Node.js has two module systems: CommonJS (original) and ECMAScript Modules (standard). They have different semantics: CJS is synchronous, ESM is async. Mixing requires explicit interop.
Revisions (0)
No revisions yet.