С помощью модулей AMD, когда (или почему) можно использовать require () внутри define ()?
Вопрос
Мое понимание модулей AMD (с использованием, например, requirejs или curl.js):
require()
используется для асинхронной загрузки разных модулей и при загрузке, тогда выполняется обратный вызов.
И определить модуль, у вас будут отдельные сценарии, которые используют define()
Но я видел, как некоторые модули используют require()
внутри определения их функции, например
define([a, b, c], function(i, ii, iii){
require([d, e, f], function(d, e, f) {
// do some stuff with these require()'d dependancies
})
/* rest of the code for this module */
})
Но я нахожу это запутанным, потому что я бы подумал, что если у модуля есть зависимость, то они должны пройти через основную define([dependancies], fnDefinition)
функционировать, а не в нем через require()
В соответствии с приведенным выше примером.
Есть ли причины этого?
Решение
Есть несколько причин, по которым вы можете использовать require()
в модуле.
Но сначала будьте уверены, что вы запросите ссылку на правильную require
переменная. В вашем примере ссылка на require
это Глобальный. Анкет Вам нужна ссылка на require
Это оценивается в контексте вашего модуля (иногда называемый «локальным потребностями»). Это просто:
define(["a", "b", "c", "require"], function(i, ii, iii, require){
require(["d", "e", "f"], function(moduleD, moduleE, moduleF) {
// do some stuff with these require()'d dependencies
})
/* rest of the code for this module */
});
Основная причина, по которой это важно, состоит в том, чтобы убедиться, что относительные идентификаторы модуля (например, "./peermodule" или "../unclepath/cousinmodule") разрешены правильно. (Это одна из причин, у curl.js нет глобального require
по умолчанию.)
Причины использовать местный require
:
- Вы не знаете, какие модули нужны во время сборки (или во время загрузки) из-за условий выполнения
- Вы явно хотите отложить нагрузку некоторых модулей, пока они не понадобятся
- Вы хотите загрузить вариацию модуля на основе результатов обнаружения функций (хотя плагин Dojo «имеет!
Наконец, AMD определяет второе использование require
Для совместимости с модулями, авторомными в модулях CommonJS/1.1, которые затем обернуты в define
. Анкет Они выглядят так:
define(function(require, exports, module){
var a = require("pkgZ/moduleA"), // dependency
b = require("pkgZ/moduleB"); // dependency
/* rest of the code for this module */
});
DavaScript Devs на стороне сервера может найти этот формат привлекательным. :)
Некоторые погрузчики AMD (такие как requirejs 0,2+, dojo 1.7+, bdload и curl.js 0,6+) будут обнаружить этот гибридный формат AMD/CJSM1.1 и найдет зависимости путем сканирования модуля для require
вызовы