В чем преимущество каркаса Dojo 1.7 AMD?
Я читал о том, как загрузчик dojo 1.7 использует API/ Framework AMD здесь и здесь, и я натолкнулся на эту цитату на одном из слайдов: "Наибольшее преимущество AMD - не возможность загружать скрипты на -спрос, как могут подумать некоторые люди, самым большим преимуществом является увеличение организации / модульности кода, а также снижение потребности в глобальных / пространствах имен. " Но мой вопрос заключается в том, нельзя ли уже избежать глобальных переменных с помощью обычных функций js и, возможно, dojo.hitch (), если вам нужен доступ к контексту выполнения другой функции (и к "закрытым" переменным другой функции)? Другими словами, кроме асинхронной загрузки только того, что вам нужно, в чем преимущество платформы AMD?
1 ответ
Преимуществами AMD являются преимущества наличия модульной системы, аналогичной системе пространств имен на других языках. В JavaScript мы часто имитировали это с помощью глобальных переменных, но модули дают ряд конкретных преимуществ:
Этим модулям предлагается конфиденциальность их главной области применения, возможность импорта одноэлементных объектов из других модулей и экспорта их собственных API.
--- Из спецификации CommonJS Modules/1.1.1, с которой все началось.
Ключевым здесь является импорт и экспорт объектов. Раньше все делали это специально, с глобальными 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 лучшим.