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

StackOverflow https://stackoverflow.com/questions/7835116

  •  27-10-2019
  •  | 
  •  

Вопрос

Мое понимание модулей 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:

  1. Вы не знаете, какие модули нужны во время сборки (или во время загрузки) из-за условий выполнения
  2. Вы явно хотите отложить нагрузку некоторых модулей, пока они не понадобятся
  3. Вы хотите загрузить вариацию модуля на основе результатов обнаружения функций (хотя плагин 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 вызовы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top