Как AMD (в частности, RequireJS) обрабатывает зависимости между несколькими модулями

#requirejs #js-amd

#requirejs #js-amd

Вопрос:

У меня есть мой основной сценарий инициализации, который вызывает require(), и одна из зависимостей — это платформа утилит, но некоторые другие модули, которые я указываю через require(), также сами определили эту структуру как зависимость.

Например (init.js ):

 require(['module-a', 'module-b', 'module-c'], function(a, b, c){
    // where module-c is the framework
});
  

А затем в ‘module-a’ у меня есть:

 define(['module-c'], function(c){
    // utilize module-c framework
});
  

Итак, как AMD / RequireJS обрабатывает этот сценарий, загружает ли он один и тот же фреймворк дважды?

Любая помощь приветствуется.

С уважением, Марк

Ответ №1:

Он будет загружен только один раз, оба вышеуказанных модуля получат одинаковое значение модуля для ‘module-c’.

Комментарии:

1. Большое спасибо за подтверждение! Это именно то, на что я надеялся, потому что, на мой взгляд, указание зависимости внутри каждого модуля имело больше смысла, поскольку это означало, что я смогу взять этот модуль и повторно использовать его в другом месте в совершенно другом другом проекте.

2. Внутренне загрузчик AMD отслеживает (т.Е. Кэширует) все модули. Когда модули оптимизированы / объединены вместе, это не интересно. Однако, если какой-либо из модулей загружен точно в срок, важно отметить, что загрузчик AMD отслеживает запросы , чтобы два почти одновременных запроса не пытались загрузить один и тот же модуль более одного раза.

Ответ №2:

Если это полезно для других — вот ситуация, с которой я столкнулся, когда модуль был загружен дважды:

Для следующей структуры проекта:

 ~/prj/js/app/fileA.js
~/prj/js/app/util/fileB.js
~/prj/js/ext/publisher.js
  

где RequireJS baseurl ~/prj/js/app

fileA.js относится к внешней (внешней) зависимости publisher.js как:

 //fileA:
define(['../ext/publisher'], function(){});
  

Но fileB.js ссылается на ту же зависимость с другим путем:

 //fileB:
define(['../../ext/publisher'], function(){});
  

Короче говоря, для обоих файлов пути зависимостей разные, хотя зависимость находится в одном и том же месте. В этом случае publisher.js заряжается дважды.

Используйте Net вкладку Firebug, чтобы увидеть, как она загружается дважды:

dependency.js заряжается дважды (firebug)

Это легко исправить, используя paths для настройки пути к внешней папке (как описано в документах require_js):

 requirejs.config({
    paths: {ext: '../ext'}
});
  

После настройки paths зависимость загружается только один раз, fileA.js и fileB.js оба используют один и тот же путь зависимости следующим образом:

 //fileA:
define(['ext/publisher'], function(){});
  

и

 //fileB:
define(['ext/publisher'], function(){});