Ответ 1
Если вы имеете дело только с браузером (а не node.js), это всего лишь несколько строк, чтобы библиотека поддерживала как AMD, так и не AMD.
Например, вот файл из jQuery, который делает это, из которых все, кроме четырех, являются комментариями:
// Execute the factory to produce jQuery
var jQuery = factory( window );
// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
});
}
И очень похожий фрагмент от Knockout можно найти здесь:
} else if (typeof define === 'function' && define['amd']) {
// [2] AMD anonymous module
define(['exports'], factory);
}
Обратите внимание, что jQuery использует метод named module, в то время как нокаут использует анонимный модуль. jQuery также оставляет $
и jQuery
в глобальном пространстве имен даже когда AMD обнаружена, тогда как Knockout (и, возможно, многие другие) не помещает что-либо в глобальное пространство имен при обнаружении AMD. Для каждого подхода есть плюсы и минусы, о чем свидетельствуют следующие вопросы: