Как я могу определить только один конструктор объекта с помощью 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
});

Это отлично подходит, если я хочу присоединить свойства к экспортируемому объекту, но что, если я хочу просто вернуть одну функцию-конструктор из этого определения и позволить всем трем системам загрузить этот модуль и напрямую использовать возвращенную функцию, а не необходимость возвращать литерал объекта и обращаться к конструктору как к свойству литерала?


person Michael Cordingley    schedule 21.05.2014    source источник


Ответы (2)


Это невозможно, просто указав самый первый элемент в вашем списке.

Модуль Контекст

  1. В модуле есть свободная переменная require, которая соответствует приведенному выше определению [sic].
  2. In a module, there is a free variable called "exports", that is an object that the module may add its API to as it executes.
    1. modules must use the "exports" object as the only means of exporting.
  3. In a module, there must be a free variable "module", that is an Object.
    1. The "module" object must have a "id" property that is the top-level "id" of the module. The "id" property must be such that require(module.id) will return the exports object from which the module.id originated. (That is to say module.id can be passed to another module, and requiring that must return the original module). When feasible this property should be read-only, don't delete.
    2. Объект «модуль» может иметь строку «uri», которая является полным URI ресурса, из которого был создан модуль. Свойство «uri» не должно существовать в песочнице.

То есть exports - это объект; это должен быть единственный объект, с помощью которого можно экспортировать методы; и вы можете только добавить к нему.

person Ry-♦    schedule 21.05.2014
comment
Кажется, что спецификация CommonJS запрещает это, но это выполнимо в Node (который, насколько мне известно, не полностью соответствует CommonJS). И это работает и для RequireJS. Я опубликовал рабочий пример как отдельный ответ. - person Ates Goral; 18.01.2015

Следующее работает как для 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;
}));
person Ates Goral    schedule 18.01.2015