2015-09-24 5 views
0

Итак, у меня есть несколько файлов javascript, которые я хочу запустить в определенном порядке, и вместо того, чтобы делать теги скриптов на странице html, я бы хотел использовать requirejs, чтобы я может модулировать код. Прежде чем я начал модульную работу с блоками define и начал рефакторинг кода, я хотел просто настроить порядок зависимостей. Поэтому у меня есть файлы, как этотRequirejs: зависимости не работают

index.html

<script src="scripts/depends/require.js"></script> 
<script> 
    (function(){ 
     require(['scripts/main.js', function(){}]); 
    }()); 
</script> 

main.js

require(['scripts/services/fileLoader.js', 'scripts/services/Options.js'], function(){ 
    // do stuff 
}); 

fileLoader.js

require([ 
    'scripts/services/alert.js', 
    'scripts/services/game.js', 
    'scripts/services/parser.js', 
    'scripts/services/options.js' 
], function() { 
    // do stuff 
}); 

Теперь это довольно очевидно, что я хочу здесь. Я хочу, чтобы main вызывал fileLoader.js, а затем я хотел бы, чтобы fileLoader.js вызывал каждую из своих зависимостей, прежде чем он вызывает обратный вызов. Затем, когда fileLoader.js завершил свой обратный вызов, я хотел бы, чтобы main завершил свои зависимости аналогично, прежде чем, наконец, вызвать его обратный вызов в последний раз, что и требовалось сделать.

Однако вот что происходит. Требуются основные вызовы, и я вижу, что загружаются файлы fileLoader.js и options.js. Но перед тем, как вызывается любая из зависимостей, требуемых fileLoader (а также ее собственный обратный вызов, который должен быть запущен для правильной работы основного), вызывается обратный вызов main.js. Что происходит?

tl; dr - главный обратный вызов, вызываемый перед обратным вызовом зависимого, почему?

ответ

2

Вопрос заключается в том, что вы используете require, где вы должны использовать defineи вы не прошли опции конфигурации enforceDefine: true в RequireJS. Вы всегда должны запускать RequireJS с enforceDefine: true, если вы не можете ссылаться на основную причину. Без него, если RequireJS загружает модуль без define, он просто пожимает плечами и движется дальше. И вы получаете поведение, которое получаете.

Проблема в том, что только defineопределяет модулей, require не будет. Поэтому, если в файле модуля нет define, RequireJS не знает, от чего действительно зависит модуль. Он будет планировать загрузку модулей, перечисленных в зависимостях вызова require, но они не считаются зависимостями модуля, которые будут определены в файле.

Итак, в main.js замените верхний уровень require на define. Также в fileLoader.js и во всех других модулях, которые вы хотите создать.

Кроме того, не помещайте .js в конце имен модулей. RequireJS делает это за вас. Если вы выразите это, вы получите неожиданные результаты. Это не является причиной вашей проблемы, но это может быть фактором в других обстоятельствах.

+0

Прохладный, что сделал. Быстрый вопрос, если важно, чтобы forceceDefine был true, тогда почему это не поведение по умолчанию? – FatalCatharsis

+0

@FatalCatharsis По-моему, значение по умолчанию должно быть «true». Однако могут быть исторические причины, по которым значение по умолчанию - «false». Возможно, автор RequireJS не хотел нарушать какое-либо поведение, от которого зависели пользователи RequireJS. Вот почему я сказал, что всегда использую его, если вы не можете ссылаться на основную причину. Возможно, есть причины. Я, конечно, не встречал их. – Louis

Смежные вопросы