В чём разница между CommonJS и ES-модулями в Node.js и как их совмещать?
Модули и пакеты
CommonJS (`require`) загружает модули синхронно во время выполнения, ES-модули (`import`) анализируются статически и загружаются асинхронно.
Различия
- Синтаксис:
module.exportsиrequire()противexportиimport. - ESM поддерживает top-level
await, CommonJS нет. - В ESM нет
__dirnameи__filename, вместо нихimport.meta.url. - Импорты в ESM статические, поэтому возможен tree shaking.
- Режим включают расширением
.mjsили полем"type": "module"вpackage.json.
Совместимость
- ESM может импортировать CommonJS:
import pkg from './legacy.cjs'. - CommonJS не может синхронно
requireESM; нужен динамическийawait import('./mod.mjs').
// ESM: аналог __dirname
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
const __dirname = dirname(fileURLToPath(import.meta.url));Коротко для собеседования
Новый код лучше писать на ESM. CommonJS остаётся в старых пакетах, а стыковка делается через динамический import() и расширения .cjs и .mjs.