Оптимизатор requireJS не включает вложенные вызовы require

Я довольно долго читаю документацию по оптимизатору, но, кажется, не могу понять. Док говорит:

Оптимизатор будет комбинировать только те модули, которые указаны в массивах строковых литералов, которые передаются в вызовы require и define верхнего уровня, или вызовы строковых литералов require('name') в упрощенной оболочке CommonJS. Таким образом, он не найдет модули, загружаемые через имя переменной:

ОК, пока все хорошо. В основном это означает, что r.js не будет включать и сканировать вложенные зависимости. Теперь давайте предположим, что у нас есть файл «основного приложения», который выглядит следующим образом:

require([ 'es5shim', 'tools' ], function() {
    console.log('fictive app entry point');

    require([ 'domready!' ], function( doc ) {
        console.log('domReady, loading GUI modules...');
        require([ 'GUI/window', 'GUI/header', 'GUI/content' ]);
    });
});

Думаю, здесь проблема становится довольно очевидной. r.js (оптимизатор) создает этот файл, связывая с ним только es5shim.js и tools.js. Есть ли хороший способ/обходной путь, чтобы сообщить этому оптимизатору, что он также должен связать файлы window.js, header.js и content.js в этом примере?

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

Вопрос:

  • Если бы я просто перечислил все модули в "Top require call", r.js также включил бы+связал бы все верхние вызовы require и define из вложенных и вложенно-вложенных модулей в main- файл приложения ?

  • Они упоминают параметр include для r.js в Документах. Есть ли здесь смысл, и если да, то как его правильно вызвать?

Конечно, вы не хотите потерять возможность ленивой загрузки модулей позже, но для такого рода зависимости (ожидание DOMContentLoaded) я надеюсь, что есть способ обойти это.


person jAndy    schedule 26.07.2012    source источник
comment
Я не понимаю: зачем вам нужна вложенность? Почему бы просто не сделать GUI/окно зависимым от es5shim, а es5shim — от domready! ?   -  person machineghost    schedule 26.07.2012


Ответы (1)


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

findNestedDependencies: true

в настройках оптимизации. Надеюсь, это поможет.

person Aaronius    schedule 10.08.2012
comment
Это действительно полезно знать, и это не особенно легко найти в документации RequireJS. - person hellosmithy; 11.11.2013
comment
Обратите внимание, что если вы объявите свою конфигурацию, используя форму require = {...}, это не сработает, так как переменная require будет скрывать вложенные вызовы require. Использование другого формата конфигурации исправляет это, например. требуютjs.config({...}) - person pheelicks; 13.12.2014