Как браузер обрабатывает циклические зависимости?

Я рассматриваю возможность переноса большой базы кода на основе браузера на CommonJS (это приложение AngularJS 1.x, написанное на TypeScript). Приложение имеет циклические зависимости, поэтому я думаю, что RequireJS не может быть и речи.

Как Browserify обрабатывает циклические зависимости? Существуют ли разные категории циклических зависимостей, которые поддерживаются/не поддерживаются? Или какие-нибудь советы по работе с циклическими зависимостями с CommonJS/Browserify?


person Eric    schedule 25.01.2016    source источник
comment
если мой ответ был полезен для вас, пожалуйста, примите его :)   -  person Josip Ivic    schedule 22.03.2016
comment
вы получили ответ?   -  person rijin    schedule 07.02.2018


Ответы (1)


Browserify не добавляет особой обработки к циклическим зависимостям, и его поведение унаследовано от Node.

Это выглядит так, как показано в документации Node Modules, которую я полностью цитирую ниже:


Когда есть циклические вызовы require(), модуль может не завершить выполнение, когда он возвращается.

Рассмотрим эту ситуацию:

a.js:

console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');

b.js:

console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');

основной.js:

console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done = %j, b.done = %j', a.done, b.done);

Когда main.js загружает a.js, то a.js, в свою очередь, загружает b.js. В этот момент b.js пытается загрузить a.js. Чтобы предотвратить бесконечный цикл, незаконченная копия объекта экспорта a.js возвращается в модуль b.js. Затем b.js завершает загрузку, и его объект экспорта предоставляется модулю a.js.

К тому времени, когда main.js загрузит оба модуля, они оба готовы. Таким образом, вывод этой программы будет следующим:

$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done = true, b.done = true

Требуется тщательное планирование, чтобы обеспечить правильную работу зависимостей циклических модулей в приложении.

person Andre Figueiredo    schedule 08.04.2018
comment
см. больше в stackoverflow.com/questions/10869276/ - person Andre Figueiredo; 08.04.2018