带有requireJs的主干AMD

时间:2014-05-06 15:50:55

标签: javascript backbone.js requirejs amd

从日志开始,Backbone现在为AMD(Require.js)注册自v1.1.1。

很好,所以我尝试对模块做同样的事情,但有些事情我不明白。

如果我们查看section 4 of annotated sources来源,该模块不会返回全局Backbone。

不需要垫片和窗口.Backbone可用。但是Backbone如何不能被定义?

//定义主干模块

define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
   root.Backbone = factory(root, exports, _, $);
});

//需要Backbone模块

require(['backbone'], function (Backbone) {
  Backbone // is not undefined ?
});

//模态模块定义

define(['jquery'], function ($) {
   root.Modal = factory(root, {}, $);
});

//需要模态模块

require(['modal'], function (Modal) {
   Modal // undefined
});

进入我的模块(使用相同的结构),当我需要我的模块时,如果我没有返回任何内容,我得到undefined

我必须返回root.Modal以使其工作。 return root.Modal = factory(root, {}, $);

主要问题是“模块不返回任何内容时如何需要模块?

我在requireJS上遗漏了一些东西,但是我找不到它。

http://backbonejs.org/docs/backbone.html#section-4

1 个答案:

答案 0 :(得分:2)

有问题的代码是:

define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
    root.Backbone = factory(root, exports, _, $);
});

现在注意factory调用exports作为第二个参数。工厂函数将通过在此对象上设置字段来导出Backbone的方法。这就是为什么当你需要Backbone时,你得到一个有用的值,而不是undefined或垃圾。

这个原因是,RequireJS支持通过从define的工厂函数返回一个值来定义模块,所以你可以这样做:

define(function () {
    return {
        foo: function () { ... }
    };
});

但它也支持其他方法,例如:

define(['exports'], function (exports) {
    exports.foo = function () { ... };
});

在上面的代码中,依赖项列表中名为exports的模块是一个特殊的(和保留的)模块名称,这意味着"给我一个对象,我可以在其上设置字段以导出值&#34 ;。 Backbone使用第二种导出值的方式。