Рассмотрим небольшой конкретный пример использования инструкций dojo.require и dojo.provide. Для начала рассмотрим простой модуль, реализующий такую тривиальную функцию, как функцию вычисления членов последовательности Фибоначчи. В примере 2.3 ресурс связан с модулем. И хотя группировка ресурсов в модули не является строго обязательной, тем не менее практически всегда это целесообразно. В этой книге вам часто будет встречаться имя dtdg (от «Dojo: The Definitive Guide1»), используемое в качестве общего пространства имен для модулей.
Пример 2.3. Определение простого модуля (dtdg.foo)
/*
Инструкция dojo.provide указывает, что файл .js с исходным программным кодом образует модуль dtdg.foo. Семантически модуль dtdg.foo также образует пространство имен для функций, входящих в состав модуля. На диске этот файл мог бы иметь имя foo.js и находиться в каталоге dtdg.
*/
dojo.provide("dtdg.foo");
//Обратите внимание: функции объявляются относительно пространства имен модуля
dtdg.foo.fibonacci = function(x) {
if (x < 0)
throw Exception("Illegal argument");
if (x <= 1)
return x;
return dtdg.foo.fibonacci(x-1) + dtdg.foo.fibonacci(x-2);
}
Предположим, когданибудь, при создании другой страницы, вы решили использовать свой модуль dtdg.foo, чтобы удивить юных математиков из начальной школы. Вместо того чтобы заново переписывать хорошо протестированную функцию и тем самым повышать вероят
ность появления ошибок, вы можете снова использовать свой модуль, подключив его с помощью dojo.require. В примере 2.4 показано, как вы можете использовать локальный модуль совместно с инструментальным набором, загружаемым из CDN. В этом примере предполагается, что этот файл HTML сохранен в каталоге, содержащем каталог dtdg, в котором находится модуль из примера 2.3.
Пример 2.4. Использование локального модуля в процедуре самонастройки XDomain
<html>
<head>
<title>Fun With Fibonacci!</title>
<script
type="text/javascript"
src="http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js"
djConfig="baseUrl:'./'">
</script>
<script type="text/javascript">
dojo.registerModulePath("dtdg", "./dtdg");
dojo.require("dtdg.foo");
/* с этого момента dojo.require выполняется асинхронно, потому что используется Dojo в сборке Xdomain. Будет лучше, если все обращения к dtdg.foo будут происходить в addOnLoad */
dojo.addOnLoad(function() {
dojo.body().innerHTML = "guess what? fibonacci(5) = " +
dtdg.foo.fibonacci(5);
});
</script>
</head>
(body)
(/body)
</html>
Этот пример наглядно демонстрирует, насколько просто с помощью dojo.require подключить ресурс к странице и затем использовать его. Кроме того, здесь имеется несколько интересных моментов, которые следует отметить особо.
В случае использования локальной копии инструментарий Dojo с точки зрения модулей выглядит как корневой каталог, но при использовании версии XDomain «настоящий» корневой каталог инструмента рия находится гдето на одном из серверов компании AOL. Поэтому, чтобы определить начальную точку поиска локальных модулей, в данном случае – dtdg.foo, в массиве djConfig явно задается значение параметра baseUrl.
Функция dojo.registerModulePath просто связывает пространство имен верхнего уровня (первый аргумент функции) с именем каталога относительно baseUrl (второй аргумент).
Все, что определяется в вашем модуле, станет доступно для использования в результате вызова dojo.require. Например, если предположить, что модуль dtdg.foo содержит дополнительные функции или переменные, они будут доступны после выполнения инструкции dojo.re-quire("dtdg.foo"). Как обычно, мы нигде не обращаемся к содержимому dtdg.foo за пределами блока addOnLoad.
Возможно, в предыдущем примере вы также заметили вызов функции dojo.body(). По сути, это упрощенный способ получить доступ к телу текущего документа в противоположность менее удобному методу do-cument.body.