使用 requireJs 的模块中的循环依赖关系
Circular Dependencies in modules using requireJs
阅读requireJs文档,
为了修复循环依赖,建议使用exports
为模块创建一个空对象,该对象可立即供其他模块参考。
我尝试了这段代码,但它似乎不起作用。怎么了?
附言:
阅读注释以查看输出,
尤其是 setTimeout 调用中的 B 模块。
// A module
define([
'b'
], function (b) {
console.log('B:', b); // B, Object
var A = {
boo: 1
};
return A;
});
// B module
define([
'a',
'exports'
], function (a, exports) {
console.log('A:', a); // A, undefined (as I was expecting)
exports.A = function () {
return a;
}
var B = {
bar: 1
};
setTimeout(function () {
console.log('exports.A', exports.A()); // exports.A undefined
// I would like to access the A object
// which is defined in A module
}, 500);
return B;
});
// main.js
(function () {
define([
'a'
], function () {
});
}());
您应该能够在 B 模块中使用 require()
的同步版本来访问"A"模块:
// B module
define([
'a',
'exports'
], function (a, exports) {
console.log('A:', a); // A, undefined (as I was expecting)
exports.A = function () {
return require('a');
}
...
});
我经常在使用 AMD 模块构建应用程序核心时遇到循环问题,该核心既可以支持许多模块,又包含供这些模块使用的配置或其他有用对象。
我今天做了一些实验,这似乎效果很好。
define(['exports', 'underscore', './config', './mediator'],
function (exports, _, Backbone, config, Mediator){
Core = /* ... */
// Publicize a core 'singleton' so that it's dependencies can access it, and so can modules that define it as a dependency themselves.
core = new Core()
exports.core = core //publicize it in a way that supports circularity
return core // And also publicize it normally
}
)
这些对象彼此"==="相等,所以这看起来很有希望。
编辑:
上述方法在优化后不起作用。这是另一种可能(未经测试)的方法:https://github.com/requirejs/example-multipage/blob/master/www/js/app/main1.js#L2
define(function (require) {
var $ = require('jquery'),
lib = require('./lib'),
Core;
Core = /* ... */
return new Core()
});
一种选择是不返回模块本身,而是返回实例化模块的函数(在本例中,它将是打字稿中定义的构造函数,底部是生成的js代码-请注意,接口不会生成.js代码)
-
文件 IA.ts
/// <reference path="IB.ts" /> interface IA{ funcA(); _classB : IB; }
-
文件 IB.ts
/// <reference path="IA.ts" /> interface IB{ funcB(); _classA : IA; }
-
文件类 A.ts
/// <reference path="IA.ts" /> /// <reference path="IB.ts" /> export class ClassA implements IA { _classB : IB = null; constructor(classB : IB) { this._classB = classB; if (classB){ this._classB._classA = this; } return this; } funcA(){ console.log('I am ClassA'); } }
-
文件类 B.ts
/// <reference path="IA.ts" /> /// <reference path="IB.ts" /> export class ClassB implements IB { _classA : IA = null; constructor(classA : IA) { this._classA = classA; if (classA){ this._classA._classB = this; } return this; } funcB(){ console.log('I am ClassB'); } }
-
File MainTest.ts
/// <reference path="../../def/require.d.ts" /> /// <reference path="IA.ts" /> /// <reference path="IB.ts" /> define(['ClassA', 'ClassB'], function (classA, classB) { var aa : IA = new classA.ClassA(); var bb : IB = new classB.ClassB(aa); bb.funcB(); aa._classB.funcB(); bb._classA.funcA(); aa.funcA(); });
和生成的js代码:
-
文件类 A.js
define(["require", "exports"], function(require, exports) { var ClassA = (function () { function ClassA(classB) { this._classB = null; this._classB = classB; if (classB) { this._classB._classA = this; } return this; } ClassA.prototype.funcA = function () { console.log('I am ClassA'); }; return ClassA; })(); exports.ClassA = ClassA; });
-
文件类 B.js
define(["require", "exports"], function(require, exports) { var ClassB = (function () { function ClassB(classA) { this._classA = null; this._classA = classA; if (classA) { this._classA._classB = this; } return this; } ClassB.prototype.funcB = function () { console.log('I am ClassB'); }; return ClassB; })(); exports.ClassB = ClassB; });
-
文件主测试.js
define(['ClassA', 'ClassB'], function (classA, classB) { var aa = new classA.ClassA(); var bb = new classB.ClassB(aa); bb.funcB(); aa._classB.funcB(); bb._classA.funcA(); aa.funcA(); });
最后,输出将是:
我是B类
我是B类
我是A类
我是A类
相关文章:
- 单元测试依赖关系没有被嘲笑
- FRP 中 EventStreams 的循环依赖关系
- 节点模块依赖关系
- 在Meteor中使用具有依赖关系的NPM包
- requirejs定义:嵌套依赖关系
- Django管道和javascript依赖关系
- 在Aurelia computeds中,当设置依赖关系时,如何声明对对象属性的依赖关系
- Npm未满足对等依赖关系
- Node.JS处理重复的可传递依赖关系
- 在Firefox上使用聚合物的javascript依赖关系的HTML导入困难;Safari
- 库中的匿名定义()模块's的依赖关系导致库损坏'的家属
- 使用Require.js按照依赖关系的顺序加载JavaScript
- GraphQL代码中的Javascript循环依赖关系
- 使用 grunt 检查单个 javascript 文件时如何解决依赖关系
- 与超类的依赖关系
- 在 Angular JS 业力测试中管理依赖关系
- 在 webpack 中管理 jQuery 插件依赖关系
- requirejs+bower,bower组件中的路径和依赖关系
- 预构建的NPM包:如何为用户省去依赖关系
- 聚合物种子-自定义元素依赖关系