Вопрос

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

Прежде чем я использовал плагин заказа requirejs, но он, похоже, не работает с Dojo Amd Loader. Я не могу найти ничего об этом в документации по загрузке или документации по строительству доджо.

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

Это было полезно?

Решение

Я просто узнаю об этом сам, но документация, которую я нашел Общий впрыск сценария

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

Мой пример:

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

});

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

Другие советы

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

Пример (НЕПРАВИЛЬНЫЙ):
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;
})

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

require(["legacyDeps"],function(legacyDeps){
    legacyDeps.then(function(){
        //It's save to assume that all legacy modules have been loaded here.
    });
});

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top