Подтвердить что ты не робот

Циклический импорт с веб-пакетом, возвращающим пустой объект

Нажатие этой точной проблемы в настоящее время:

FileA:
var b = require file B
var c = require file C

FileB:
var a = require file A

FileC:
var a = require file A

Когда я запускаю код, я получаю сообщение об ошибке в файле C:

A.doSomething is not a function

Отбросил там отладчик и увидел, что A - пустой объект. Что действительно действительно, так это то, что я получаю ошибку только в файле C, но не в файле B. Super confused здесь.

4b9b3361

Ответ 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';