Il plugin ordine RequireJS e Dojo 1.7.1
-
27-10-2019 - |
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?
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.