PassFront
  1. PassFront
  2. База знаний
  3. Модули и пакеты

В чём разница между 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 не может синхронно require ESM; нужен динамический 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.

Другие вопросы раздела