Основные различия между ECMAScript Modules (ESM) и CommonJS (CJS), где ESM уступает в функциональности:
В CJS можно использовать динамический require с переменными:
const path = './module.js';
const module = require(path); // Работает
В ESM динамический импорт возможен только через import() (асинхронно), а строковый литерал в статическом импорте обязателен:
import module from './module.js'; // OK
const path = './module.js';
import module from path; // Синтаксическая ошибка
CJS предоставляет эти полезные глобальные переменные:
console.log(__dirname); // Путь к текущей директории
console.log(__filename); // Путь к текущему файлу
В ESM их нет, приходится использовать:
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
CJS позволяет выполнять код в любом месте модуля:
if (condition) {
require('moduleA');
} else {
require('moduleB');
}
ESM требует статических импортов на верхнем уровне.
CJS обрабатывает циклические зависимости более предсказуемо благодаря:
ESM может вести себя неожиданно при циклических зависимостях из-за асинхронной природы.
CJS не требует указания расширений файлов:
const module = require('./module'); // Работает с .js, .json и др.
ESM требует явного указания расширения:
import module from './module.js'; // Обязательно .js
В CJS JSON можно импортировать напрямую:
const data = require('./data.json');
В ESM требуется либо:
CJS поддерживает:
require.extensions['.css'] = ... // Можно добавить обработчики
ESM не предоставляет подобных возможностей для модификации системы загрузки модулей.
В CJS есть доступ к кэшу:
delete require.cache[require.resolve('module')]; // Можно удалить из кэша
В ESM такого API нет.
ESM предлагает современный, стандартизированный подход к модулям, но лишается некоторых гибких возможностей CJS, особенно в динамических сценариях и низкоуровневом контроле. Переход на ESM часто требует пересмотра архитектуры приложения и использования обходных путей для привычных CJS-паттернов.