Ответ 1
Относительные идентификаторы разрешаются относительно идентификатора модуля, в котором разрешен идентификатор. См. раздел AMD module id format
.
Существует два способа привязать относительный идентификатор зависимостей к правильному контексту/области:
Определить вызов
Определить вызов - это начало/определение модуля. Все зависимости, запрашиваемые в вызове define()
, ограничены в пределах/относительно этого идентификатора модуля. Пример:
// does not matter what the file name is.
define(
'hand/named/module'
, ['./child']
, factoryFunction
)
или
// inside of 'hand/named/module.js' file.
define(
['./child']
, factoryFunction
)
В обоих указанных случаях ./child
разрешен в отношении идентификатора модуля, определенного вызовом define()
. Идентификатор модуля в обоих случаях равен hand/named/module
, а ./child
разрешен hand/named/child
(+ '.js', очевидно, когда приходит время его получить)
"Сфера применения" требует
Вы можете изменить область вызова require
с глобальной на локальную, переопределив ее. На самом деле вам не нужно переопределять/сохранять имя require
, это означает, что он изменяет. Требуемая функциональность становится "локальной" для определенного модуля.
// inside 'hand/named/module.js' file
define(
['require']
, function(myLocalRequire){
require('./child', function(){
// outcome A
})
myLocalRequire('./child', function(){
// outcome B
})
}
)
В результате A вы продолжаете использовать "глобальный" запрос - тот, который привязан к родительской области. Ваш ./child
разрешает baseURL + '/child'
Результат B локально ограничен, привязан к id модуля hand/named/module
, поэтому ./child
разрешено hand/named/child
Рекомендуем @CristiPufu переопределить глобальную переменную require
с локальным объектом, который будет локальным только для области действия этой функции:
// inside 'hand/named/module.js' file
define(
['require']
, function(require){
return function(){
// here we have access only to "local" require,
// since in the function declaration you decided to
// override the 'require' variable with new object.
// All code outside of this function will use global require.
require('./child', function(){
// outcome B
})
}
}
)
Мое предпочтение заключается в размещении всех относительных ресурсов внутри вызова define
. Делает их ясными и более заметными, поскольку они ясно показывают, к чему они относятся.