Плагин заказа requirejs и Dojo 1.7.1
-
27-10-2019 - |
Вопрос
Я обновляю проект от 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. })
Тем не менее, есть решение этой проблемы. Вам нужно вернуть Отсрочен Это решается, как только загружаются все модули. Следующий пример загружает 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! с оценкой. Это встроит контент в начале строительства.