В чем преимущество каркаса 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 лучшим.

Другие вопросы по тегам