Выбор ответа Senior Модули и npm обновлено

require(esm) в Node 22

Вопрос

В Node 22.12+ CommonJS-код делает require("./lib.mjs"). Когда это упадёт?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Если в графе этого ES-модуля есть top-level await: будет ERRREQUIREASYNCMODULE. Начиная с Node 22.12 (и 20.19) require() синхронного ES-модуля работает без флага: возвращается объект пространства имён модуля.

Варианты ответа

  1. Всегда: CommonJS не может загружать ES-модули, только через import()
  2. Если в графе этого ES-модуля есть top-level await: будет ERR_REQUIRE_ASYNC_MODULEправильный ответ
  3. Только если у пакета нет поля exports
  4. Если ES-модуль использует export default: require вернёт только именованные экспорты

Разбор

Начиная с Node 22.12 (и 20.19) require() синхронного ES-модуля работает без флага: возвращается объект пространства имён модуля. Ограничение одно и принципиальное: require синхронный, поэтому модуль с top-level await (в нём самом или в его зависимостях) загрузить нельзя, будет ERR_REQUIRE_ASYNC_MODULE.

export default поддерживается, он доступен как свойство default объекта. Поле exports к возможности require(esm) отношения не имеет. Утверждение «всегда падает» было верно для старых версий Node.

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

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

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