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