【问题标题】:Backbone AMD with requireJs带有 requireJs 的主干 AMD
【发布时间】:2014-06-23 08:11:07
【问题描述】:

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

太好了,所以我尝试对一个模块做同样的事情,但有些东西我不明白。

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

不需要 shim 和 window.Backbone 可用。但是 Backbone 怎么不能被 undefined 呢?

// 定义主干模块

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

// 需要主干模块

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

【问题讨论】:

  • 永远,永远不要使用 window.Backbone,如果它像 AMD 模块一样注册,您不需要“shim”,您的文件命名为“backbone.js”?
  • 我不使用 window.Backbone :) 你说的是我的模块文件吗?我有具有相同文件结构的 modal.js。
  • 如果您在模块中调用“backbone”,则必须拥有“backbone.js”文件,除非您在此名称之前进行了映射...

标签: javascript backbone.js requirejs amd


【解决方案1】:

有问题的代码是这样的:

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 的模块是一个特殊的(和保留的)模块名称,意思是“给我一个对象,我可以在其上设置字段以导出值”。 Backbone 使用第二种导出值的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多