Ответ 1
Вот список различных форматов совместимых модулей.
Я подозреваю, что тот, который вы ищете, это то, что они называют " commonjsStrict.js"
Есть ли способ создать javascript-микробиблиотеку (библиотека, которая не имеет зависимостей), которые поддерживают все следующие форматы модулей:
Вот список различных форматов совместимых модулей.
Я подозреваю, что тот, который вы ищете, это то, что они называют " commonjsStrict.js"
Да, и я должен ответить на ded и его удивительные модули:
(function(name, definition) {
if (typeof module != 'undefined') module.exports = definition();
else if (typeof define == 'function' && typeof define.amd == 'object') define(definition);
else this[name] = definition();
}('mod', function() {
//This is the code you would normally have inside define() or add to module.exports
return {
sayHi: function(name) {
console.log('Hi ' + name + '!');
}
};
}));
Затем это можно использовать:
в AMD (например, с requireJS):
requirejs(['mod'], function(mod) {
mod.sayHi('Marc');
});
в commonJS (например, узел JS):
var mod = require('./mod');
mod.sayHi('Marc');
глобально (например, в HTML):
<script src="mod.js"></script>
<script>mod.sayHi('Marc');</script>
Этот метод должен получить больше гласности - если jQuery и co. начал использовать его, было бы намного проще!
uRequire, универсальный модуль и конвертер ресурсов - это инструмент, который делает именно это.
В основном конвертирует AMD и CommonJS в UMD/AMD/CommonJS/Plain script (не требуется загрузчик AMD).
Он разрешает декларативный экспорт модулей с noConflict()
запеченным.
Он может манипулировать модулями (вставлять/заменять/удалять зависимости или код) по мере их создания.
Он преобразует из coffeescript, coco, Livescript, icedCoffeescript, и вы можете добавлять свои собственные преобразования в один лайнер!
Просто чтобы немного обновить этот ответ в отношении @marc, я тоже отдает должное ded и обновил его немного, чтобы быть с последними обновлениями:
(function (name, definition, context, dependencies) {
if (typeof context['module'] !== 'undefined' && context['module']['exports']) { if (dependencies && context['require']) { for (var i = 0; i < dependencies.length; i++) context[dependencies[i]] = context['require'](dependencies[i]); } context['module']['exports'] = definition.apply(context); }
else if (typeof context['define'] !== 'undefined' && context['define'] === 'function' && context['define']['amd']) { define(name, (dependencies || []), definition); }
else { context[name] = definition(); }
})('events', function () {
// Insert code here
return {
sayHi: function(name) {
console.log('Hi ' + name + '!');
}
};
}, (this || {}));
Объект в конце - ссылка на родительскую или текущую область, позволяет сказать, что у вас есть пакет, который вы пишете, и это всего лишь кусок пирога, ну, этот контекст может быть объектом с разнесением по словам, и это это всего лишь кусочек этого пирога.
Кроме того, если вы хотите иметь зависимости, в конце появляется необязательный параметр, который поддерживает массив, в этом случае параметр определения может использовать каждую зависимость в качестве аргумента. Кроме того, зависимости, перечисленные в массиве, потребуются внутри платформы node -js для вашего удобства.
Смотрите: https://gist.github.com/Nijikokun/5192472 для реального примера.
Я решил эту точную проблему и сумел легко поддерживать:
Он использует комбинацию инъекций зависимостей и IIFE, чтобы выполнить задание.
См. ниже:
/*global jQuery:false, window:false */
// # A method of loading a basic library in AMD, Node.JS require(), jQuery and Javascript plain old window namespace.
(function(exporterFunction) {
exporterFunction('cll',
function(a,b) {
return a+b;
}
);
})(
(function() { // Gets an exportFunction to normalize Node / Dojo / jQuery / window.*
if ((typeof module != 'undefined') && (module.exports)) { // Node Module
return function(library_name,what_was_exported) {
module.exports = what_was_exported;
return;
};
}
if (typeof define != 'undefined' && define.hasOwnProperty('amd') && define.amd) { // Dojo AMD
return function(library_name,what_was_exported) {
define(function() {
return what_was_exported;
});
};
}
if (typeof jQuery === 'function') { // jQuery Plugin
return function(library_name,source) {
jQuery.fn[library_name] = source;
return;
};
}
if (typeof window != 'undefined') { // Fall down to attaching to window...
return function(library_name,what_was_exported) {
window[library_name] = what_was_exported;
};
}
})(),
(function() {
// ## Other Parameters Here
// You could add parameters to the wrapping function, to include extra
// functionalilty which is dependant upon the environment... See
// https://github.com/forbesmyester/me_map_reduce for ideas.
return 'this_could_be_more_arguments_to_the_main_function';
})()
);
Public Gist доступен в https://gist.github.com/forbesmyester/5293746
Это основано на ответе Ниджикокуна. Поскольку RequireJS не рекомендует использовать явные имена модулей, это было опущено в этой версии. Второй аргумент загрузчика описывает зависимости. Pass []
, если вам не нужно загружать какие-либо файлы.
var loader = function(name, dependencies, definition) {
if (typeof module === 'object' && module && module.exports) {
dependencies = dependencies.map(require);
module.exports = definition.apply(context, dependencies);
} else if (typeof require === 'function') {
define(dependencies, definition);
} else {
window[name] = definition();
}
};
loader('app', ['jquery', 'moment'], function($, moment) {
// do your thing
return something;
}