2012-07-09 20 views
8

Ho definito una configurazione RequireJs che definisce i percorsi e gli spessori:RequireJs: Utilizzare caricamento automatico-dipendenze con spessore

require.config({ 
    // define application bootstrap 
    deps: ["main"], 

    // define library shortcuts 
    paths: { 
     app: "app" 
     , jquery: "lib/jquery" 
     , underscore: "lib/underscore" 
     , backbone: "lib/backbone" 
     , bootstrap: "lib/bootstrap" 
    }, 

    // define library dependencies 
    shim: { 
     jquery: { 
      exports: "$" 
     }, 
     underscore: { 
      exports: "_" 
     }, 
     backbone: { 
      deps: ["underscore", "jquery"], 
      exports: "Backbone" 
     }, 
     bootstrap: { 
      deps: ['jquery'], 
      exports: "bootstrap" 
     }, 

     // main application 
     app: { 
      deps: ["backbone"], 
      exports: "App" 
     } 
    } 
}); 

Come vedi l'ultimo "shim" dichiarazione dovrebbe rendere in grado di accedere spina dorsale (e deps) quando carico l'app principale (-namespace).

In realtà questo non funziona:

require(["app"], function($, _, Backbone, App){ 
    app.router = new Backbone.Router.extend({ 
     // routing and route actions 
    }); 
}); 

Quello che mi fa chiedo è che nella "spina dorsale-boilderplate" -project, spina dorsale (e le sue dipendenze) sono disponibili in questo modo: https://github.com/tbranyen/backbone-boilerplate/blob/master/app/main.js

Non c'era nemmeno bisogno di definire questo nella funzione.

Quindi cosa sto sbagliando?

+2

prova a rimuovere '$, _, Backbone' dalla funzione' require' dove estendi il router. Penso che gli shim funzionino in modo tale da esportare solo valori globali che non è necessario aggiungere a qualsiasi chiamata – jakee

+0

Ehi, funziona perfettamente :) Posso persino eliminare la parola chiave "backbone" nell'array deps della funzione define anche se questo non funziona in ogni modulo ... Vuoi creare una risposta in modo da poter chiudere la domanda? –

+0

Fatto, felice di poterti aiutare! – jakee

risposta

5

Rimuovere il $, _, Backbone -parametri dalla funzione require -function dove si estende il router. Gli shim esportano i valori globali, quindi non è necessario fare riferimento ad essi nelle chiamate require o define come per le dipendenze regolari.

Passandoli come parametri, si mischiano con le variabili globali e molto probabilmente i risultati sono indefiniti.

+1

Una precisione: passando Backbone come parametro nasconde la definizione globale, è possibile utilizzare 'window.Backbone' direttamente – nikoshr

11

Da quello che ho letto, requirejs passa gli argomenti in base a quanto specificato nella matrice ... Così la chiamata dovrebbe essere simile a questo:

require(["app"], function (App) { // less arguments 
}); 

O come questa:

require(
    ["jquery", "underscore", "backbone", "app"], // more deps 
    function ($, _, Backbone, App) { 
    } 
); 
+0

Ti ho votato. Non sono d'accordo con Jakee su questo. – Constantine

+0

Sono d'accordo anch'io. incapsulare le dipendenze è l'intero punto di AMD. Dovresti farlo in questo modo –

+0

mentre qui hai le variabili incapsulate, non sei conforme al principio secco. Diciamo che improvvisamente 'app' ha più dipendenze di quelle che hai elencato lì. – Toskan

Problemi correlati