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

Циклический require

Вопрос

Запускаем node ca.cjs. Что выведется?

// ca.cjs
exports.done = false;
const b = require('./cb.cjs');
console.log('in a, b =', b);
exports.done = true;

// cb.cjs
const a = require('./ca.cjs');
exports.fromB = a.done;
exports.done = true;

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

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

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

Коротко

Правильный ответ: in a, b = { fromB: false, done: true }. Когда cb.cjs требует ca.cjs, тот уже в кеше, но выполнен только до строки с require. cb получает недоделанный exports, где done пока false.

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

  1. in a, b = { fromB: false, done: true }правильный ответ
  2. Бесконечная рекурсия и переполнение стека
  3. in a, b = { fromB: true, done: true }
  4. Ошибку ERR_REQUIRE_CYCLE

Разбор

Когда cb.cjs требует ca.cjs, тот уже в кеше, но выполнен только до строки с require. cb получает недоделанный exports, где done пока false. Поэтому fromB: false.

  • Бесконечной рекурсии нет: модуль попадает в кеш до начала выполнения.
  • fromB: true было бы, если бы ca успел дойти до конца.
  • Такой ошибки в Node нет, циклы молча разрешаются через частичный exports.

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

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

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