Подтвердить что ты не робот

С модулями AMD, когда (или почему) нормально использовать require() внутри define()?

Мое понимание модулей AMD (используя, например, RequireJs или curl.js):

require() используется для асинхронной загрузки разных модулей и при загрузке выполняется обратный вызов fn.

И чтобы определить модуль, у вас будут отдельные скрипты, которые используют 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(), как это делает вышеприведенный пример.

Есть ли основания для этого?

4b9b3361

Ответ 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.