![]()
Using require() in ES Modules
The error occurs because you’re trying to use CommonJS require() syntax in a file that’s treated as an ES module (typically indicated by "type": "module" in your package.json or using .mjs extension).
Solutions
Option 1: Switch to ES Module imports (recommended)
// Change this:
const module = require('module-name');
// To this:
import module from 'module-name';
// or for named exports:
import { namedExport } from 'module-name';
Option 2: Convert your project to CommonJS
- Remove
"type": "module"from package.json (or set to"commonjs") - Change file extensions from
.mjsto.cjsif needed
Option 3: Dynamic import (for async requires)
// Instead of:
const module = require('module-name');
// Use:
const module = await import('module-name');
// Then access default export with .default:
const thing = module.default;
// Or named exports:
const { namedThing } = module;
Option 4: Create compatibility layer (not recommended)
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
// Now you can use require
const module = require('module-name');
Key Differences
| Feature | ES Modules (import) | CommonJS (require) |
|---|---|---|
| Syntax | Static (analyzed at compile) | Dynamic (runtime) |
| Loading | Asynchronous | Synchronous |
| File extension | .mjs or type:module | .js/.cjs or default |
| Node support | v12+ | All versions |
Best Practice
- New projects should use ES Modules (
import/export) - If working with older code, either:
- Convert to ES Modules gradually
- Use
.cjsextension for CommonJS files - Use dynamic imports when needed
Example Conversion
Before (CommonJS):
const fs = require('fs');
const { readFile } = require('fs').promises;
module.exports = { myFunction };
After (ES Modules):
import fs from 'fs';
import { promises } from 'fs';
const { readFile } = promises;
export { myFunction };
// or export default myFunction;
