2015-08-07 2 views
9

se si dispone di un modulo RequireJS in questo modo:RequireJS delle dipendenze

define(
    [ 
     '#patches', 
     'backbone', 
     'underscore', 
     'react', 
     '#allCollections', 
     '#allModels', 
     'app/js/routers/router', 
     '#allTemplates', 
     '#allControllers', 
     '#allRelViews' 
    ], 

function(){ 

    var patches = arguments[0]; 

}); 

non v'è alcun modo di sapere che la dipendenza viene caricato prima? Nel mio caso, "#patches" sono alcune funzioni di utilità window.X che voglio caricare prima di ogni altra cosa. Devo configurarlo in modo diverso per garantirlo?

(nel mio caso "#' è solo la mia notazione per indicare un modulo il cui percorso è predefinito nel mio file di configurazione principale)

+1

Come già detto François Richard, è possibile influenzare l'ordine in cui le dipendenze si caricano implicitamente ma non lo consiglierei come best practice. La solita strada da percorrere è che ogni dipendenza stessa stabilisce le sue dipendenze, quindi se ad esempio il tuo '# allRelViews' ha bisogno delle utilità della finestra, dovrebbe indicarlo nella sua chiamata' define'. Se non hai il controllo della dipendenza ti suggerirei di usare l'approccio * shim * che è stato suggerito nella risposta accettata - l'unico altro modo in cui vedo è modificare la sorgente, ma dovresti farlo per ogni aggiornamento della biblioteca. – mfeineis

+1

Backbone e Underscore sono conformi a AMD. (Chiamano 'define'.) Se i tuoi moduli chiamano anche' define', allora la maggior parte dei moduli che mostri nella tua domanda non possono essere usati con la risposta che hai accettato perché ** 'shim' ha un comportamento definito solo per non- Moduli AMD **. Se usi 'shim' per un modulo che chiama' define', i risultati non sono definiti. (Quando l'ho provato, di solito veniva ignorato, ma poiché non ci sono semantica, RequireJS è libero di cambiare ciò che fa da una versione all'altra. È come un puntatore non inizializzato in C: non è garantito quale valore ottiene.) – Louis

+0

Qualche soluzione per i moduli AMD attuali? – Patrick

risposta

13

Dalla documentazione: http://requirejs.org/docs/api.html#mechanics

"RequireJS attende tutte le dipendenze a carica, calcola l'ordine corretto in cui chiamare le funzioni che definiscono i moduli, quindi chiama le funzioni di definizione del modulo una volta chiamate le dipendenze per tali funzioni. Si noti che le dipendenze per una determinata funzione di definizione del modulo possono essere richiamate in qualsiasi ordine, a causa delle relazioni di dipendenza e dell'ordine di caricamento della rete. "

Penso che questo possa aiutare: http://www.sitepoint.com/understanding-requirejs-for-effective-javascript-module-loading/ (vedere" Gestione dell'ordine dei file dipendenti ") ")

RequireJS utilizza il caricamento asincrono del modulo (AMD) per il caricamento dei file.Ogni modulo dipendente inizierà il caricamento attraverso richieste asincrone nell'ordine specificato. Anche se l'ordine dei file è considerato, non possiamo garantire che il primo file sia caricato prima il secondo file a causa della natura asincrona, pertanto RequireJS ci consente di utilizzare shim config per definire la sequenza di file che devono essere caricati nell'ordine corretto. Vediamo come possiamo creare le opzioni di configurazione in RequireJS.

requirejs.config({ 
    shim: { 
    'source1': ['dependency1','dependency2'], 
    'source2': ['source1'] 
    } 
}); 

Speranza che aiuta

EDIT: Come detto nei commenti, utilizzando Shim per il modulo AMD è una cattiva idea, utilizzare solo spessore per i moduli non AMD e gestire ordine dipendenze lì. Per il modulo AMD requirejs gestirà l'ordine di caricamento. Un buon collegamento dai commenti (grazie Daniel Tulp) ==>Requirejs why and when to use shim config

+0

in modo da poter garantire un certo ordine di carico utilizzando l'opzione shim –

+0

Se l'ordine è di conseguenza, penso che dovrebbe essere raggruppato in più moduli anziché in shim. Richiedere ordini richiede che il modulo definito sappia cose su ciascun modulo richiesto e sarà più difficile riutilizzarlo. – Asken

+2

** 'shim' è solo per moduli non AMD. ** L'inserimento di una configurazione' shim' per un modulo AMD comporta un comportamento indefinito. L'OP sta usando Backbone e Underscore, che sono entrambi moduli AMD (e sono già da un po 'di tempo) quindi non puoi usare 'shim' per loro. – Louis