#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, чтобы увидеть, как она загружается дважды:
Это легко исправить, используя paths
для настройки пути к внешней папке (как описано в документах require_js):
requirejs.config({
paths: {ext: '../ext'}
});
После настройки paths
зависимость загружается только один раз, fileA.js
и fileB.js
оба используют один и тот же путь зависимости следующим образом:
//fileA:
define(['ext/publisher'], function(){});
и
//fileB:
define(['ext/publisher'], function(){});