Как лучше всего сделать плагин 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');
}
};
}));