Domanda

Sto aggiornando un progetto da Dojo 1.6.1 utilizzando AMD e RequireJS al Dojo 1.7.1 con la nuova AMD caricatore. Ho a che fare con i vecchi file JavaScript, non scritti come moduli di AMD, e devono caricarli nel giusto ordine.

Prima ho usato il plugin ordine RequireJS, ma non sembra funzionare con Dojo AMD Loader. Non riesco a trovare nulla al riguardo nella documentazione del caricatore o del Dojo Corporatura documentazione del Sistema.

Come trovi questo? Se non ci sono plug-in ordine, come devo gestire i file JavaScript pianura con Dojo 1.7? Devo gestire separatamente, o ci sono funzionalità per questo nel sistema di caricamento o costruire?

È stato utile?

Soluzione

Sto imparando su questo me stesso, ma la documentazione che ho trovato si riferisce a iniezione script generico

Carica i tuoi script generici, come descritto nella documentazione, specificando {asincrona: 0} come opzione di configurazione per require (). Questo, per la mia comprensione, viene caricato gli script nell'ordine specificato nel secondo parametro (la matrice contenente lo script nomi di file / percorsi)

Il mio esempio:

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

});

I miei test locali indicano se cambio di configurazione per {async: 1} il carico script in un ordine diverso da quello che ho specificato. Finora non ho rintracciato questo giù nel codice dojo caricatore, ma sembra avere senso, e il lavoro, e non è un hack.

Altri suggerimenti

mi piacerebbe proporre un altro approccio per tale modulo una dipendenza come accennato nei commenti di cui sopra. Il problema è che define non accetta un parametro async. Utilizzando un semplice require all'interno della funzione define introduce una condizione perché il codice dei moduli necessari non viene ancora eseguita.

Esempio ( SBAGLIATO ):
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 )

Tuttavia, v'è una soluzione a questo problema. , è necessario restituire un differite che viene risolto nel più breve tempo tutti i moduli sono caricati. L'esempio seguente carica a, b, c, d per.

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

Per le proprietà di accesso definiti in moduleA, è ora possibile utilizzare

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

Non credo che i plugin sono generalmente compatibili tra caricatori AMD. Non è ottimale, ma probabilmente è possibile utilizzare dojo / testo! con un eval. Questo sarebbe il contenuto inline a buildtime.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top