Есть несколько причин, по которым вы можете захотеть использовать require()
в модуле.
Но сначала убедитесь, что вы запрашиваете ссылку на правильную переменную require
. В вашем примере ссылка на require
является global . Вы хотите ссылку на 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 "has!" Может быть лучшим решением (извините, ссылка ускользает от меня))
Наконец, AMD определяет второе использование require
для совместимости с модулями, созданными в CommonJS Modules / 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 */
});
Разработчики javascript на стороне сервера могут посчитать этот формат привлекательным. :)
Некоторые загрузчики AMD (такие как RequireJS 0.2+, dojo 1.7+, bdLoad и curl.js 0.6+) обнаруживают этот гибридный формат AMD / CJSM1.1 и находят зависимости путем сканирования модуля на наличие вызовов require
.