【问题标题】:top-level namespace and usage of exports of Backbone source codeBackbone 源代码导出的顶级命名空间和使用
【发布时间】:2013-01-03 04:49:42
【问题描述】:

我正在尝试阅读 Backbone.js 的源代码。我对下面的代码感到很困惑,它应该声明 Backbone 的顶级命名空间。任何人都可以提供一些线索或解释吗?一些有用的链接来启发这个也非常受欢迎!

// The top-level namespace. All public Backbone classes and modules will
  // be attached to this. Exported for both CommonJS and the browser.
  var Backbone;
  if (typeof exports !== 'undefined') {
    Backbone = exports;
  } else {
    Backbone = root.Backbone = {};
  }

【问题讨论】:

    标签: javascript backbone.js namespaces


    【解决方案1】:

    exports 是一个 CommonJS 模式全局(想想 require.js 和 node.js),用于模块化提供代码。最重要的检查是查看exports 是否可用。如果是,则为 Backbone 全局提供导出引用,以便可以正确地模块化导出。

    如果您不是通过 AMD 样式的加载器加载 Backbone,它是由标准对象字面量定义的。

    关于此事的进一步阅读:

    http://dailyjs.com/2010/10/18/modules/

    What is the purpose of Node.js module.exports and how do you use it?

    What is exports and prototype in Javascript?

    进一步说明:

    exports 本身除了普通的对象字面量外,还带有一些额外的“健壮性”。 CommonJS 模块化模式需要这种“健壮性”。请注意这里的 Node.js 源代码:

    function Module(id, parent) {
      this.id = id;
      this.exports = {};
      this.parent = parent;
      if (parent && parent.children) {
        parent.children.push(this);
      }
    
      this.filename = null;
      this.loaded = false;
      this.children = [];
    }
    
    module.exports = Module;
    

    Backbone 全局可以访问模块化模式所需的所有第三级深度。否则,Backbone 将简单地从一个无聊的旧空 object 定义开始。

    【讨论】:

    • 感谢您的详细解答。但我不太清楚“Backbone global 被赋予导出引用,因此它可以正确地模块化导出”的含义。为什么使用“主干=出口;”而不是“exports = root.Backbone”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多