Плагин заказа RequireJS и Dojo 1.7.1 - PullRequest
5 голосов
/ 11 января 2012

Я обновляю проект с Dojo 1.6.1 с использованием AMD и RequireJS до Dojo 1.7.1 с его новым загрузчиком AMD. Мне приходится иметь дело со старыми файлами JavaScript, не написанными как модули AMD, и загружать их в правильном порядке.

До этого я использовал плагин заказа RequireJS, но он не работает с Dojo AMD Loader. Я не могу найти ничего об этом в документации по загрузчику или в документации по системе сборки Dojo.

Есть мысли по этому поводу? Если нет плагина заказа, как мне обрабатывать простые файлы JavaScript вместе с Dojo 1.7? Нужно ли обрабатывать их отдельно или в загрузчике или сборочной системе есть функциональность для этого?

Ответы [ 3 ]

4 голосов
/ 14 января 2012

Я только что узнал об этом сам, но документация, которую я нашел, ссылается на Generic Script Injection

Загрузите ваши общие сценарии, как описано в документации, указав {async: 0} в качестве параметра конфигурации для require (). Это, насколько я понимаю, загружает скрипты в порядке, указанном вами во втором параметре (массив, содержащий имена файлов / пути скриптов)

Мой пример:

require({async:0},['test1.js','test2.js','test3.js'],function(){
    //do stuff with reference to loaded scripts

});

Мои локальные тесты показывают, что если я изменю конфигурацию на {async: 1}, сценарии загружаются в порядке, отличном от указанного мной. До сих пор я не отслеживал это в коде загрузчика dojo, но, похоже, он имеет смысл и работает, и не является хаком.

3 голосов
/ 08 декабря 2012

Я хотел бы предложить другой подход для такого модуля зависимости, как упомянуто в комментариях выше.Проблема в том, что define не принимает параметр async.Использование простого require внутри функции define вводит условие гонки, поскольку код требуемых модулей еще не выполнен.

Пример ( WRONG ):
oldCode.js

window.foo = function(){};

legacyWrapper.js

define(["require"],function(require){
    require({async:0},["./oldCode"]);
})

code.js

define(["./legacyWrapper"],function(){
    window.foo(); //throws exception, foo has not been loaded yet.
})

( jsFiddle demo )

Однако есть решение этой проблемы. Вам необходимо вернуть Отложено это решается, как только все модули загружены.В следующем примере загружаются a, b, c, d по порядку.

define(["require","dojo/Deferred"],function(require,Deferred){
    var def = new Deferred();
    require({async:0},
            ["./moduleA",
             "./moduleB",
             "./moduleC",
             "./moduleD"],
             function(){
        def.resolve();
    });
    return def;
})

Для доступа к свойствам, определенным в модуле A, теперь вы можете использовать

require(["legacyDeps"],function(legacyDeps){
    legacyDeps.then(function(){
        //It's save to assume that all legacy modules have been loaded here.
    });
});
2 голосов
/ 11 января 2012

Я не думаю, что плагины обычно совместимы с загрузчиками AMD. Это не оптимально, но вы, вероятно, можете использовать dojo / text! с оценкой Это встроит содержимое во время сборки.

...