【问题标题】:RequireJS, Circular Dependencies and Exports "Magic" MethodRequireJS、循环依赖和导出“魔术”方法
【发布时间】:2015-03-27 10:04:16
【问题描述】:

我一直在尝试按照James Burke's answerthis question 的建议使用the special 'exports' magic module 设置RequireJS 来处理循环依赖项。

按照@jrburke 在该问题中给出的示例:

define("Employee", ["exports", "Company"], function(Company) {
    function Employee(name) {
        this.name = name;
        this.company = new Company.Company(name + "'s own company");
    };
    exports.Employee = Employee;
});
define("Company", ["exports", "Employee"], function(Employee) {
    function Company(name) {
        this.name = name;
        this.employees = [];
    };
    Company.prototype.addEmployee = function(name) {
        var employee = new Employee.Employee(name);
        this.employees.push(employee);
        employee.company = this;
    };
    exports.Company = Company;
});

jsfiddle

问题是用他自己的例子,exports 模块是未定义的,因此exports.Employeeexports.Company 不设置。如果我尝试将导出作为定义回调函数的参数包含在内,它只会在两种情况下都初始化为空,并且不携带分配给它的构造函数。

我做错了什么?

编辑:通过反复试验,我得到了上面的代码:http://jsfiddle.net/jpk45vow/4/。谁能解释为什么它有效,因为它对我来说毫无意义。

【问题讨论】:

  • 似乎导出模块不是全局对象。它有一个本地范围作为导出模块的助手。这就是为什么它在 main 中是空的。事实上,你不需要它,也不需要在你的主模块中使用它。
  • 是的,在阅读了您的 cmets 之后,在我看来,魔术模块正在创建一个与您在下面开发的非常相似的容器对象,除了每个模块都有自己的容器。然后当 main 需要模块时,requireJS 返回容器而不是模块,解决所有依赖问题。

标签: javascript requirejs circular-dependency


【解决方案1】:

编辑:我找不到有关魔法导出方法的更多信息。然而,我可以用一个虚拟的“容器”模块来模仿它的预期行为。在这个小提琴中看到它:http://jsfiddle.net/amenadiel/a7thxz98/

console.log("start");

define("Container",function() {
    var Container={};
    return Container;
});


define("Employee", ["Container"], function(Container) {
    var Employee= function(name) {
        this.name = name;
        this.company = new Container.Company(name + "'s own company");
    };
    Container.Employee = Employee;
});

define("Company", ["Container"], function(Container) {
    var Company=function(name) {
        this.name = name;
        this.employees = [];
    };
    Company.prototype.addEmployee = function(name) {
        var employee = new Container.Employee(name);
        this.employees.push(employee);
        employee.company = this;
    };
    Container.Company = Company;
});

define("main", ["Container","Employee","Company" ], function ( Container) {
    var john = new Container.Employee("John");
    var bigCorp = new Container.Company("Big Corp");
    bigCorp.addEmployee("Mary");
    console.log(bigCorp);
});

require(["main"]);

【讨论】:

  • 是的,正如我所说,当我尝试将 exports 对象初始化为空并且不携带已分配的构造函数时。
  • 似乎所谓的魔法导出模块并没有按照它所说的那样做。查看我的编辑
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 2014-07-29
  • 2015-05-25
  • 1970-01-01
相关资源
最近更新 更多