browserify - browserify如何处理循环依赖?

标签 browserify circular-dependency commonjs

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

Browserify 如何处理循环依赖?是否存在支持/不支持的不同类别的循环依赖项?或者有任何关于使用 CommonJS/Browserify 处理循环依赖项的技巧吗?

最佳答案

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

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

关于browserify - browserify如何处理循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004170/

相关文章:

bower - Jest 测试中的 Jest 和 Bower 模块加载

integration-testing - 无法使用 require 将模块导入 nightwatch 测试

c++ - 循环依赖和 std::vector::insert

javascript - 是否有可以用作库的 V8 CommonJS 实现?

javascript - Vueify + Elixir + 热加载 - 未捕获的类型错误 : Cannot read property 'indexOf' of undefined

javascript - 使用浏览器化 Node 应用程序访问 module.exports

react-native - 使用 babel-module-resolver 从单个文件导出时出现循环依赖问题

ruby - 两个相互依赖的 Ruby 类

reactjs - ES6 导入在 next.js 应用程序中无法正常工作

javascript - 将需要 CommonJS 功能的 JavaScript 编译为 native Java