browserify 如何处理循环依赖?

Posted

技术标签:

【中文标题】browserify 如何处理循环依赖?【英文标题】:How does browserify handle circular dependencies? 【发布时间】:2016-05-02 10:41:15 【问题描述】:

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

Browserify 如何处理循环依赖?是否支持/不支持不同类别的循环依赖项?或者使用 CommonJS/Browserify 处理循环依赖的任何提示?

【问题讨论】:

如果我的回答对你有好处,请采纳:) 你得到答案了吗? 【参考方案1】:

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

需要仔细规划才能使循环模块依赖项在应用程序中正常工作。

【讨论】:

在***.com/questions/10869276/…中查看更多信息

以上是关于browserify 如何处理循环依赖?的主要内容,如果未能解决你的问题,请参考以下文章

师妹面试被问到Spring如何处理循环依赖,我花了一晚上给她安排的明明白白

如何处理在 Angular CLI 中安装对等依赖项?

Spring如何处理循环引用

node js 循环依赖问题

如何处理需求循环?

如何处理:循环调用'Thread.sleep()',可能是忙等待