Чем CommonJS отличается от ES-модулей
Вопрос
Чем CommonJS отличается от ES-модулей и что бы ты выбрал для нового проекта на Node 22?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.