2013-03-31 12 views
7

Sto scrivendo il plugin jQuery che contiene molto codice. Quindi ho deciso di separare il codice e renderlo più modulare per me (lo sviluppatore). Per questo io uso require.js.
Ora ho 6 js file:requirejs - combina diversi file in file js singoli che non dipendono dal requirejs

  1. utils.js
  2. base-row.jas
  3. a-row.js
  4. b-row.js
  5. my-table.js
  6. main.js

file da 1 a 5 definisce "classi" JavaScript e hanno dependecies tra loro stessi. La classe "primaria" che gestisce tutto il concerto è my-table.js. main.js ha dipendenze solo per i miei-table.js e crea un plugin da esso:

require([ 
    'my-table' 
], function(MyTable) { 
    jQuery.fn.myTable = function(options) { 
     var table = new MyTable(this, options); 
     this.data('myTable', table); 
     return this; 
    }; 
}); 

Ora voglio creare da questi file un unico grande file js che contiene tutti i file 6 senza alcuna dipendenza (ad eccezione di jQuery che l'utente dovrebbe fare riferimento ad esso). Per questo ho usato r.js (http://requirejs.org/docs/optimization.html) e come risultato ho ottenuto un file js grande che dipende da require.js (e contiene chiamate da definire e richiedere). Ho seguito questo: http://requirejs.org/docs/faq-optimization.html#wrap e ho usato almond.js per combinare tutti i miei file per l'utilizzo che non dipende da require.js. Funziona bene
Il problema è perché ho bisogno di tutti definire e richiedere chiamate di metodo e almond.js? Perché l'ottimizzatore non poteva concatenare solo i risultati di funzione (come descritto in questa domanda: Why do concatenated RequireJS AMD modules need a loader?) come questo:

(function() { 
    var utils = «function() { 
     .... 
     return Utils; 
    }»(); 
    var baseRow = «function(A) { 
     .... 
     return BaseRow; 
    }»(utils); 
    .... 
    .... 
    var myTable = ..... 

    //<--This is require call and therefore doesn't return a thing 
    (function(MyTable) { 
     jQuery.fn.myTable = function(options) { 
      var table = new MyTable(this, options); 
      this.data('myTable', table); 
      return this; 
     }; 
    })(myTable); 
})(); 

Come risultato di questo processo, ho deciso di controllare le cose e unito manualmente tutti i file un file minificato. Finisco con un file più piccolo di 3k poi la versione a mandorla!
Non trovo la logica dietro l'ottimizzatore r.js che crea il risultato dipendente da require.js. Nel mio caso, nessuno dovrà usare nessuno dei file, il mio file js primario è l'unico consumatore. Cosa ne pensi?

risposta

0

Il valore di default per le findNestedDependencies opzione nell'ottimizzatore è "false", nel senso che anche dopo gli script sono ottimizzati, ci potrebbe essere ancora un nidificata require o define chiamata che richiederebbe un caricatore modulo. Un caricatore è anche necessario per le dipendenze esterne.

Sono d'accordo, tuttavia, se findNestedDependencies è impostato su "true" e nessuna dipendenza esterna fa parte del progetto, l'ottimizzatore dovrebbe essere in grado di rimuovere la sua necessità di caricatore.

-1

È possibile includere solo i file necessari nel file. Puoi farlo con una chiamata getScript.

$.getScript("my_lovely_script.js", function(){ 

    //whatever you want here. 

});