Выбор ответа 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.
Варианты ответа
in a, b = { fromB: false, done: true }правильный ответ- Бесконечная рекурсия и переполнение стека
in a, b = { fromB: true, done: true }- Ошибку
ERR_REQUIRE_CYCLE
Разбор
Когда cb.cjs требует ca.cjs, тот уже в кеше, но выполнен только до строки с require. cb получает недоделанный exports, где done пока false. Поэтому fromB: false.
- Бесконечной рекурсии нет: модуль попадает в кеш до начала выполнения.
fromB: trueбыло бы, если быcaуспел дойти до конца.- Такой ошибки в Node нет, циклы молча разрешаются через частичный exports.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.