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

require() для ES-модуля в Node 22

Вопрос

CommonJS-код в Node 22.17 делает require("./lib.mjs"). В lib.mjs есть top-level await. Что будет?

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

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

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

Коротко

Правильный ответ: Ошибка ERRREQUIREASYNCMODULE. С Node 22.12 require() умеет загружать ES-модули синхронно, но только если в графе нет top-level await.

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

  1. Модуль загрузится, а require вернёт Promise
  2. Сработает, только если запустить с --experimental-modules
  3. Модуль загрузится, await будет проигнорирован
  4. Ошибка ERR_REQUIRE_ASYNC_MODULEправильный ответ

Разбор

С Node 22.12 require() умеет загружать ES-модули синхронно, но только если в графе нет top-level await. Иначе синхронно загрузить нельзя, и Node бросает ERR_REQUIRE_ASYNC_MODULE. Выход: await import("./lib.mjs").

  • Промис возвращает import(), а не require().
  • Игнорировать await Node не может, это изменило бы семантику.
  • Флаг --experimental-modules давно не нужен и эту проблему не решает.

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

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

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