Frage

Ich aktualisiere ein Projekt von DOJO 1.6.1 mit AMD und fordert Js auf DOJO 1.7.1 mit seinem neuen AMD -Lader. Ich muss mich mit alten JavaScript -Dateien befassen, die nicht als AMD -Module geschrieben wurden, und muss sie in der richtigen Reihenfolge laden.

Bevor ich das RequiredJS -Bestell -Plugin verwendet habe, scheint es jedoch nicht mit Dojo AMD -Lader zu funktionieren. Ich kann nichts darüber in der Lader -Dokumentation oder in der Dokumentation des Dojo Build -Systems finden.

Irgendwelche Gedanken darüber? Wenn es kein Bestell -Plugin gibt, wie sollte ich dann mit DOJO 1.7 einfache JavaScript -Dateien behandeln? Muss ich sie separat verarbeiten oder gibt es hierfür im Lader oder im Build -System?

War es hilfreich?

Lösung

Ich lerne nur selbst davon, aber die Dokumentation, die ich gefunden habe Generische Skriptinjektion

Laden Sie Ihre generischen Skripte wie in den Dokumenten beschrieben, während Sie {async: 0} als Konfigurationsoption für Request () angeben. Nach meinem Verständnis lädt dies die Skripte in der Reihenfolge, die Sie im zweiten Parameter angeben (das Array, das die Skript -Dateinamen/Pfade enthält)

Mein Beispiel:

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

});

Meine lokalen Tests zeigen, ob ich die Konfiguration in {async: 1} Die Skripte in einer anderen Reihenfolge als das, was ich angegeben habe, ändere. Bisher habe ich dies im Dojo Loader -Code nicht verfolgt, aber es scheint Sinn zu machen und zu arbeiten und ist kein Hack.

Andere Tipps

Ich möchte einen anderen Ansatz für ein solches Abhängigkeitsmodul vorschlagen, wie in den obigen Kommentaren erwähnt. Das Problem ist, dass define akzeptiert nicht async Parameter. Mit einem einfachen require im Inneren define Funktion führt eine Rennbedingung ein, da der Code der erforderlichen Module noch nicht ausgeführt wird.

Beispiel (FALSCH):
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)

Es gibt jedoch eine Lösung für dieses Problem. Sie müssen a zurückgeben Aufgeschoben Das wird gelöst, sobald alle Module geladen sind. Das folgende Beispiel lädt a, b, c, d in Ordnung.

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

Um auf Eigenschaften zuzugreifen, die in Modulea definiert sind, können Sie jetzt verwenden

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

Ich denke nicht, dass Plugins im Allgemeinen über AMD -Lader kompatibel sind. Es ist nicht optimal, aber Sie können wahrscheinlich Dojo/Text verwenden! mit einer Bewertung. Das würde den Inhalt zur Buildtime einleiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top