Как лучше всего сделать плагин CJS, AMD и тег-скрипт дружественным, чтобы он также был готов для CJS/AMD/ скрипт-тег?

Я пытаюсь написать плагин для библиотеки (MomentJS), который можно использовать практически везде. Я планирую использовать его с RequireJS, поэтому он должен быть дружественным к AMD, но я также хотел бы пойти дальше и сделать его пригодным для использования теми, кто загружает его через теги скрипта в браузере или в Node.

Покопавшись, я ударил это вместе:

(function() {
    var hasModule = typeof module !== "undefined"  && module.exports;

    var MY_LIB_DEF = function (moment, global) {
        if(typeof moment == "undefined") {
            throw "Can't find moment";
        }

        var MY_LIB = {
            //
            //DEFINE PLUGIN
            //
        };

        if(hasModule) {
            module.exports = LIB
        } else if(global) {
            global.LIB = LIB;
        } else {
            return LIB;
        }
    };

    if(hasModule) {
        moment = require('moment');
    }

    if (typeof define === "function" && define.amd) {
        define(["moment"], MY_LIB_DEF);
    } else {
        MY_LIB_DEF(moment, this);
    }
})();

Нижний раздел MY_LIB_DEF, где я определяю, экспортирую ли я для CJS, привязываюсь к окну или возвращаюсь для AMD, кажется немного неуклюжим, так же как мой выбор способа запуска (загрузка CJS и скрипта делит выполнение определения функция. Но "глобальное", переданное в него, никогда не будет использовано).

Хотя вышесказанное работает, я думаю, что эта проблема уже решена. Я просто не могу найти примеры для подражания.

Кто-нибудь знает о лучших методах для этого?

1 ответ

Решение

После поиска я нашел здесь полезную информацию, которая поможет решить проблему. Мне все еще нужно было немного помассировать, но, похоже, это решение.

(function(root, definition) {
    "use strict";
    var moment;

    if (typeof module !== 'undefined' && module.exports) {
        moment = require('moment');
        module.exports = definition(moment);
    } else if (typeof define === 'function' && define.amd){
        define(['moment'], definition);
    } else {
        root['MY_LIB'] = definition(root.moment);
    }
}(this, function(moment) {
    if(typeof moment === "undefined") {
        throw "Can't find moment";
    }
    return {
        foo: function() {
            console.log('bar');
        }
    };
}));
Другие вопросы по тегам