Ответ вслух Middle Модули и npm спрашивают часто обновлено

Чем CommonJS отличается от ES-модулей

Вопрос

Чем CommonJS отличается от ES-модулей и что бы ты выбрал для нового проекта на Node 22?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

CommonJS это исторический формат Node. require синхронно читает и выполняет файл, результат module.exports кешируется, а сам вызов можно сделать где угодно, хоть внутри if. Node оборачивает файл в функцию, отсюда dirname и module.

Что должно прозвучать в ответе

  • CJS: require синхронный и динамический, module.exports, кеш, обёртка с __dirname

  • ESM: статические import/export, живые привязки, top-level await, strict mode

  • Формат: .mjs/.cjs или поле type в package.json

  • Совместимость: ESM импортирует CJS; CJS грузит ESM через import() или require() без top-level await (Node 22.12+)

  • Для нового проекта ESM: стандарт, tree shaking, одинаково с браузером

Что могут спросить следом

  • Что происходит при циклической зависимости в CJS и в ESM?
  • Как опубликовать библиотеку, которую можно подключить обоими способами?
  • Почему в ESM нужно писать расширение файла?

Разбор

CommonJS это исторический формат Node. require синхронно читает и выполняет файл, результат module.exports кешируется, а сам вызов можно сделать где угодно, хоть внутри if. Node оборачивает файл в функцию, отсюда __dirname и module.

ES-модули это стандарт языка. Импорты статические, Node строит граф до выполнения, поэтому сборщики умеют tree shaking, а ошибки в именах видны сразу. Импорт это живая привязка к переменной модуля. Есть top-level await, всё в strict mode, а вместо __dirname используется import.meta.dirname.

Node решает, какой это формат, по расширению или полю type в package.json. ESM может импортировать CommonJS, а из CommonJS ESM грузится через import(), а в Node 22.12+ и через require, если нет top-level await.

Для нового проекта беру ESM: это стандарт, он одинаков с браузером и с инструментами. CommonJS оставляю только там, где этого требует старая зависимость.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме