Ответ 1
Это не проблема веб-пакета, а свойство модулей CommonJS.
Когда сначала требуется модуль CommonJS, его свойство exports
инициализируется пустым объектом за кулисами.
module.exports = {};
Затем модуль может решить расширить это свойство exports
или переопределить его.
exports.namedExport = function() { /* ... */ }; // extends
module.exports = { namedExport: function() { /* ... */ } }; // overrides
Поэтому, когда A
требует B
и B
требует A
сразу после, A
не выполняется снова (что приведет к бесконечному циклу), но возвращается его текущее свойство exports
. Поскольку A
требуется B
в самой верхней части файла, перед экспортом чего-либо вызов require('A')
в модуле B
даст пустой объект.
Общим решением для циклических зависимостей является то, что ваш импорт в конце файла, после, вы экспортировали переменные, необходимые для других модулей.
A
:
module.exports = { foo: 'bar' };
require('B'); // at this point A.exports is not empty anymore
B
:
var A = require('A');
A.foo === 'bar';