Как AMD (в частности, RequireJs) обрабатывает зависимости между несколькими модулями - PullRequest
9 голосов
/ 23 октября 2011

У меня есть основной сценарий инициализации, который вызывает 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 / RequireJ справляются с этим сценарием, загружает ли он один и тот же каркас дважды?

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

С уважением, Mark

Ответы [ 2 ]

6 голосов
/ 23 октября 2011

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

2 голосов
/ 16 августа 2012

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

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

~/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 being loaded twice (firebug)

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

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

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

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

и

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