Преимуществами AMD являются преимущества наличия модульной системы , аналогичной системе пространств имен на других языках.В JavaScript мы часто фальсифицировали это с помощью глобальных переменных, но модули дают ряд конкретных преимуществ:
Этим модулям предлагается конфиденциальность их главной области применения, возможность импорта одноэлементных объектов из других модулей и экспортаих собственный API.
--- Из спецификации CommonJS Modules / 1.1.1 , с которой все началось.
Ключом здесь является импорт и экспортобъекты.Раньше все делали это ad-hoc с глобальными (например, window.jQuery
, window._
и т. Д.).Чтобы получить доступ к экспортируемым функциям jQuery, вам нужно знать магическое имя, надеяться, что никто не конфликтует с ним, и быть уверенным, что сценарий jQuery был загружен перед вашим сценарием.Не было никакого способа декларативно указать вашу зависимость от jQuery, и у jQuery не было никакого способа сказать «это то, что я экспортирую», кроме простого помещения их в глобальный window.jQuery
объект.
Формат модуля исправляет это: каждый модуль экспортирует определенные функции, например,
// math.js
define(function (require, exports, module) {
exports.add = function (a, b) { return a + b; };
});
, и каждый модуль может требовать определенных других модулей, например,
// perimeter.js
define(function (require, exports, module) {
var math = require("math");
exports.square = function (side) {
return math.add(math.add(side, side), math.add(side, side));
};
});
Почему AMD должна быть системой выбора модулей,Джеймс Берк, автор RequireJS --- загрузчика AMD, очень похожего на Dojo, - написал сообщение в блоге, в котором подробно объясняется, почему он считает AMD лучшим .