В чем преимущество каркаса Dojo 1.7 AMD? - PullRequest
3 голосов
/ 06 февраля 2012

Я читал о том, как загрузчик dojo 1.7 использует AMD API / framework здесь и здесь также , и я наткнулся на эту цитату на одном из слайдов: "AMD(s) наибольшим преимуществом является невозможность загрузки сценариев по требованию, как могут подумать некоторые люди, наибольшее преимущество заключается в увеличении организации / модульности кода, а также в уменьшении потребности в глобальных пространствах / пространствах имен ».Но мой вопрос заключается в том, нельзя ли уже избежать глобальных переменных с помощью обычных функций js и, возможно, dojo.hitch (), если вам нужен доступ к контексту выполнения другой функции (и к «закрытым» переменным другой функции)?Другими словами, кроме асинхронной загрузки только того, что вам нужно, в чем преимущество платформы AMD?

1 Ответ

9 голосов
/ 06 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...