2013-05-13 13 views
26

Ho un progetto requirejs di lavoro che utilizza grunt per la creazione e la distribuzione. Se non si utilizza affatto l'ottimizzazione, la build funziona senza problemi e ottengo un file js per distribuirlo in produzione.Come escludere determinati file requireJS da uglifying/optimizing

Il problema che ho è che ho alcuni framework esterni (come angularJS) in cui ho già una versione ridotta/ottimizzata di esso e non voglio ottimizzarlo di nuovo.

Attualmente senza ottimizzazione includo la versione ridotta di questo framework tramite una configurazione di percorso separata nel mio gruntfile. Mentre nel mio main.js normale ho la versione non minified per lo sviluppo.

Ora voglio utilizzare l'ottimizzatore per ottimizzare il mio codice, ma NON per ottimizzare i framework esterni. Ma i framework esterni dovrebbero essere inclusi nel grande file javascript risultante. Fondamentalmente voglio dire all'ottimizzatore che in alcuni casi dovrebbe usare il file originale.

Posso farlo qualcosa di simile?

Ho trovato solo un'opzione di esclusione globale, in modo che alcuni moduli non siano inclusi nel js ottimizzato risultante.

Questa è la mia configurazione grugnito:

requirejs: { 
      compile: { 
       options: { 
        baseUrl: "<%= pkg.folders.jsSource %>", 
        name: "../external-libs/almond-0.1.1", 
        include: "main", 
        mainConfigFile: "<%= pkg.folders.jsSource %>/main.js", 
        out: "<%= pkg.folders.build + pkg.name + '-' + pkg.version %>/js/main.js", 
        //logLevel: 0, 
        optimize: "uglify2", 
        //optimize: "none", 
        paths: { 
         'angular':'../external-libs/min/angular-1.0.4', 
         'jquery':'../external-libs/min/jquery-1.7.2', 
         'jquery.mobile':'../external-libs/min/jquery.mobile-1.2.0', 
         'adapter': '../external-libs/min/jquery-mobile-angular-adapter-1.2.0', 
         'moment': '../external-libs/moment-1.6.2.min', 
         'iscroll': '../external-libs/min/iscroll-4.2.5', 
         'iscrollview': '../external-libs/min/jquery.mobile.iscrollview-1.2.6', 
         'add2Home': '../external-libs/min/add2home', 
         'config/config': "config/<%=configDatei%>" 
        } 
       } 
      } 
     }, 

e questa è la parte rilevante dei main.js:

require.config({ 
     paths:{ 
      'angular':'../external-libs/angular-1.0.4', 
      'jquery':'../external-libs/jquery-1.7.2', 
      'jquery.mobile':'../external-libs/jquery.mobile-1.2.0', 
      'adapter': '../external-libs/jquery-mobile-angular-adapter-1.2.0', 
      'moment': '../external-libs/moment-1.6.2.min', 
      'iscroll': '../external-libs/iscroll-4.2.5', 
      'iscrollview': '../external-libs/jquery.mobile.iscrollview-1.2.6', 
      'add2Home': '../external-libs/add2home' 
     }, 
     shim:{ 
      'angular':{ deps:['jquery'], exports:'angular' }, 
      'iscroll':{ deps:['jquery'], exports:'iscroll' }, 
      'iscrollview':{ deps:['jquery.mobile', 'iscroll'], exports:'iscrollview' } 
     } 
    }); 

Grazie per qualsiasi aiuto.

risposta

19

Solo alcuni suggerimenti utilizzano vuoto: per indicare NON per includere il modulo nell'ottimizzazione.

In require.config indicherà l'utilizzo del file min.

requirejs: { 
      compile: { 
       options: { 
        {{ all other settings }} 
        paths: { 
         'angular':'empty:', 
        } 
       } 
      } 
     }, 

    require.config:{ 
       paths:{ 
       'angular':'../external-libs/min/angular-1.0.4', 
     }, 
    } 

Si prega di notare, che è "vuoto:" con un i due punti alla fine, non "vuoto". Se ometti i due punti, visualizzerai un errore del tipo:

"No such file or directory [...]/empty.js" 

Spero che questo aiuti.

+2

Questa soluzione non funziona per me usando grugnito 0.4.1 e grugnito-contrib-requirejs 0.4.1 Quando specifico "vuota:" il file è ancora in fase incluso nel processo di uglify (utilizzando uglify/uglify2). Ottengo gli stessi risultati se sto ottimizzando un singolo file o un'intera directory app. –

+1

Non funziona neanche per me. – kaiser

+0

Grunt 0.4.5, requirejs 2.1.9. Funziona come un fascino! –

5

Avevo lo stesso problema delle librerie esterne che venivano sempre ridisegnate come i commenti alla risposta, e questo è il metodo che uso per aggirare il problema. Ho due compiti, uno per il mio codice e uno per le librerie esterne. In realtà si tratta solo di copiare i file, quindi anche un'operazione di copia funzionerebbe allo stesso modo. Uso anche il keywork "vuoto:" per le librerie esterne, in modo che non siano inclusi nei minisiti del mio codice.

requirejs: { 
    options: { 
     mainConfigFile: '...', 
     fileExclusionRegExp '...common things to exclude...' 
    }, 
    main: { 
     options: { 
      baseUrl: '.../js', 
      dir: '.../js-built', 
      fileExclusionRegExp: /^external$/, 
      ... etc ... 
     } 
    }, 
    external: { 
     options: { 
      baseUrl: '.../js/external', 
      dir: '.../js-built/external', 
      optimize: 'none' 
     } 
    } 
} 
+0

Non sono riuscito a far funzionare la proprietà 'fileExclusionRegExp', ma l'esecuzione di due task requirejs consecutive con diversi' baseUrl' e 'dir' è stata la chiave per far funzionare il mio! Grazie! – kevnk

Problemi correlati