require(esm) в Node 22
Вопрос
В Node 22.12+ CommonJS-код делает require("./lib.mjs"). Когда это упадёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Всегда: CommonJS не может загружать ES-модули, только через
import() - Если в графе этого ES-модуля есть top-level await: будет
ERR_REQUIRE_ASYNC_MODULEправильный ответ - Только если у пакета нет поля
exports - Если 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 ошибок.