2012-01-11 21 views
5

Aktualizuję projekt z Dojo 1.6.1 przy użyciu AMD i RequireJS do wersji Dojo 1.7.1 z nowym programem ładującym AMD. Mam do czynienia ze starymi plikami JavaScript, nie zapisanymi jako moduły AMD, i ładuję je w odpowiedniej kolejności.Wtyczka RequireJS order i Dojo 1.7.1

Zanim użyłem wtyczki RequireJS order, ale nie działa z Dojo AMD Loader. Nie mogę znaleźć niczego na ten temat w dokumentacji programu ładującego lub dokumentacji Dojo Build System.

Jakieś przemyślenia na ten temat? Jeśli nie ma wtyczki zamówienia, jak mam obsługiwać zwykłe pliki JavaScript razem z Dojo 1.7? Czy muszę obsługiwać je osobno, czy też istnieją funkcje do tego w systemie ładującym lub kompilacji?

+0

Mówisz o plikach modułu mniej lub starym stylu modułów synchronicznych? – hugomg

+0

Po prostu zwykłe pliki JavaScript, takie jak jQuery (nie używane jako moduł AMD), napisane w dowolnym stylu. –

Odpowiedz

4

Właśnie uczę się o tym sam, ale dokumentacja znalazłem dotyczy Generic Script Injection

Załaduj skrypty generycznych, jak to opisano w docs, jednocześnie określając {async: 0} jako opcji konfiguracji dla require() . To, w moim rozumieniu, nie załadować skrypty w kolejności określonej w drugim parametrze (tablicę zawierającą nazwy plików skrypt/ki)

Mój przykład:

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

}); 

moim lokalnym Badania pokazują, jeżeli Zmieniam konfigurację na {async: 1} ładuje się skrypty w innej kolejności niż podana. Do tej pory nie śledziłem tego w kodzie programu ładującego dojo, ale wydaje się, że ma sens i działa, i nie jest hackerem.

+0

Akceptuję tę odpowiedź, ponieważ działa! W ten sposób utworzyłem "moduł zależności": define (["require"], function (require) {require ({async: 0}, ["script1.js", "script2.js", "script3.js" ]);}); '. Myślę, że to dobre rozwiązanie. Dzięki! –

+0

Jedno zastrzeżenie. Nie zbadałem tego dalej, ale wygląda na to (przynajmniej podczas ładowania skryptów w oddzielnym module, jak wspomniano powyżej) skrypty są ładowane w innym zakresie niż w przypadku ładowania za pomocą tradycyjnego znacznika skryptu. Na przykład musiałem zastąpić 'var uglyGlobal = true' z' window.uglyGlobal = true'. –

+0

Metoda iniekcji skryptu dla '{async: 1}' config ładuje skrypty za pomocą wstrzykniętego '

2

Nie sądzę, że wtyczki są ogólnie kompatybilne z ładowarkami AMD. Nie jest optymalna, ale prawdopodobnie możesz używać dojo/text! z eval. Oznaczałoby to zawartość podczas budowania.

+0

Masz na myśli to? 'define ([" text! myScript "," text! myScript2 "], function (s, s2) {eval (s); eval (s2)})' –

+0

Działa i używam go w teście doh , ale niechętnie zaznaczam to jako zaakceptowaną odpowiedź, to hack =) –

3

Chciałbym zaproponować inne podejście do takiego modułu zależności, jak wspomniano w komentarzach powyżej. Problem polega na tym, że define nie akceptuje parametru async. Używanie prostej funkcji require wewnątrz funkcji wprowadza warunki wyścigu, ponieważ kod wymaganych modułów nie jest jeszcze wykonany.

przykład (NIEWŁAŚCIWA)
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)

Istnieje jednak rozwiązanie tego problemu. Musisz zwrócić Deferred, który zostanie rozwiązany, gdy tylko wszystkie moduły zostaną załadowane. Poniższy przykład ładuje a, b, c, d w kolejności.

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

Do właściwości dostępu określonych w moduleA można teraz używać

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