Оба решают «разбить код на файлы с экспортами», но разный синтаксис, время связывания и семантика загрузки.
Сравнение
CommonJS
ES modules
Синтаксис
require / module.exports
import / export
Загрузка
обычно sync
static import связывается до evaluation; import() — async
Экспорты
копирование значений на момент require (объекты — по ссылке)
live bindings
Где
классика Node
браузер + Node, стандарт языка
// CJSmodule.exports = { value: 42 };
const m = require('./m');
// ESMexportconst value = 42;
import { value } from'./m.js';
Как думает сеньор
ESM — направление экосистемы. В Node важны "type": "module", расширения файлов, dual packages. Смешение CJS/ESM — частый источник боли.
Итог
CJS — sync require для Node-легаси; ESM — стандарт с static analysis и import/export.
На собеседовании
Ожидают не заученную таблицу, а умение связать концепцию с багом из практики: что сломается, если выбрать неправильный вариант, и какой код вы напишете в реальном PR. Короткий пример и граничный случай обычно ценятся выше длинной теории.
Чем модули CommonJS отличаются от ES modules? · Sobeso