如何使用UMD定义单个对象构造函数?

时间:2014-05-21 23:31:35

标签: javascript amd commonjs umd

我正在定义一个具有UMD风格的模块,用于定义可以在CommonJS,AMD和浏览器全局变量中使用的模块,如下所示:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) define(['exports'], factory);
    else if (typeof exports === 'object') factory(exports);
    else factory(root.GlobalObject = {});
})(this, function (exports) {
    // Module definition here
});

如果我想将属性附加到导出的对象,这非常有用,但如果我只想从此定义返回单个构造函数并让所有三个系统都能够加载此模块并直接使用返回的函数,该怎么办? ,而不是必须返回一个对象文字并访问构造函数作为文字的属性?

2 个答案:

答案 0 :(得分:1)

以下适用于AMD(RequireJS)和Node:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        define([ 'module' ], function (module) {
            module.exports = factory();
        });
    } else if (typeof module === 'object') {
        module.exports = factory();
    } else {
        root.GlobalFunction = factory();
    }
}(this, function () {
    'use strict';

    function MyFunction() {
    }

    return MyFunction;
}));

答案 1 :(得分:0)

这是不可能的,仅仅是the specification of the very first item on your list

  

模块上下文

     
      
  1. 在一个模块中,有一个自由变量“require”,它符合上述定义[原文如此]。
  2.   
  3. 在一个模块中,有一个名为“exports”的自由变量,它是模块在执行时可以添加其API的对象。   
        
    1. 模块必须使用“exports”对象作为唯一的导出方式。
    2.   
  4.   
  5. 在模块中,必须有一个自由变量“module”,即一个Object。   
        
    1. “module”对象必须具有“id”属性,该属性是模块的顶级“id”。 “id”属性必须是这样的   require(module.id)将返回从中导出的exports对象   module.id起源于。 (也就是说module.id可以传递给   另一个模块,并要求必须返回原始模块)。   可行时,此属性应为只读,不要删除。
    2.   
    3. “module”对象可能有一个“uri”字符串,它是创建模块的资源的完全限定URI。   “uri”属性不得存在于沙箱中。
    4.   
  6.   

也就是说,exports是一个对象;它必须是可以导出方法的唯一对象;你只能添加它。