1

我正在定义一个具有 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
});

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

4

2 回答 2

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;
}));
于 2015-01-18T07:24:59.577 回答
0

这是不可能的,仅根据您列表中第一项的规范

模块上下文

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

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

于 2014-05-21T23:42:07.847 回答