2012-01-11 3 views
5

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

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

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

+0

Вы говорите о модуле меньше файлов или старый стиль синхронных модулей? – hugomg

+0

Просто обычные файлы JavaScript, такие как jQuery (не используемые как модуль AMD), написанные в любом стиле, который они могут быть. –

ответ

4

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

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

Мой пример:

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

}); 

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

+0

Я принимаю этот ответ, потому что он работает! Я создал «модуль зависимостей» следующим образом: 'define ([" require "], function (require) {require ({async: 0}, [" script1.js "," script2.js "," script3.js " ]);}); '. Я думаю, что это нормально. Благодаря! –

+0

Одно предупреждение. Я еще не исследовал его, но кажется (по крайней мере, когда вы загружаете скрипты в отдельный модуль, как указано выше) сценарии загружаются в другой области, чем если бы они загружались с помощью обычного тега сценария. Например, мне пришлось заменить 'var uglyGlobal = true' на' window.uglyGlobal = true'. –

+0

Метод вставки сценария для '{async: 1}' config загружает скрипты с помощью введенного тега '

2

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

+0

Вы имеете в виду это? 'define ([" text! myScript "," text! myScript2 "], function (s, s2) {eval (s); eval (s2)})' –

+0

Он работает, и я использую его в тесте doh , но я не хочу отмечать его как принятый ответ, это хак =) –

3

Я хотел бы предложить другой подход для такого модуля зависимости, как указано в комментариях выше. Проблема в том, что 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)

Однако есть решение этой проблемы. Вам необходимо вернуть Deferred, который будет разрешен, как только будут загружены все модули. Следующий пример загружает 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; 
}) 

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

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