browserify如何处理循环依赖?

时间:2016-01-25 23:04:41

标签: browserify circular-dependency commonjs

我正在考虑将一个基于浏览器的大型代码库移到CommonJS(它是一个用TypeScript编写的AngularJS 1.x应用程序)。该应用程序具有循环依赖性,因此我认为RequireJS是不可能的。

Browserify如何处理循环依赖?是否存在不同类型的循环依赖关系?或者使用CommonJS / Browserify处理循环依赖的任何提示?

1 个答案:

答案 0 :(得分:0)

Browserify不会对循环依赖项添加特殊处理,并且该行为是从Node继承的。

Node Modules documentation所示,我在下面整合引用它:

当有循环的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');

main.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完成加载,并将其exports对象提供给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

需要仔细规划,以允许循环模块依赖项在应用程序中正常工作。