2015-09-14 12 views
9

Sto provando, usando grunt e babel, per traspolare tutti i file js6 in una cartella e finire con un singolo file concatenato (js5) con una mappa di lavoro funzionante ai file originali es6. Tuttavia, il sourcemapping non funziona. I miei Babele, impostazioni concat sotto:Grunt babel più file e preservare il mapping sorgente

"babel": { 
     options: { 
      sourceMap : true 
     }, 
     dist: { 
      files:[ 
       { 
        expand: true, 
        cwd: 'wwwroot/js/src', 
        src: ['*.js'], 
        dest: 'tmp/js' 
       }] 
     } 
    }, 

    concat: { 
     options: { 
      sourceMap: true 
     }, 
     js: { 
      src: [ 
       'tmp/js/*.js', 
      ], 
      dest: 'wwwroot/js/app.js' 
     } 
    } 

Versions: 
"grunt": "0.4.5", 
"grunt-bower-task": "0.4.0", 
"grunt-babel": "5.0.1", 
"grunt-contrib-concat" : "0.5.1" 

sto finendo con in primo luogo una cartella con un sacco di file js e mappe src (directory tmp). Ma concatenarli in un unico file incasina completamente il mapping dei sorgenti.

Idee? Inoltre, posso in qualche modo saltare la creazione di file temporanei e ordinare semplicemente il risultato del pipe in concat?

+0

È possibile eseguire un'attività concat prima e poi sul singolo file esegui l'operazione babel con l'opzione della mappa di origine true –

+0

@PrayagVerma che lo rende un po 'migliore dato che posso eseguire il debug del codice es6. Non dal file originale ma bene, meglio. – Todilo

+0

Sembra che ci sia un'opzione inputSourceMap per babel ma farlo funzionare non mi sembra banale. – Todilo

risposta

14

Invertire l'ordine di attività renderà tutto più semplice.Prima di eseguire l'attività concat nei file JS. Dopo che il compito corsa babel sul singolo file creato da concat compito in precedenza con le seguenti opzioni

options: { 
       sourceMap: true, 
       inputSourceMap: grunt.file.readJSON('script.js.map') 
      }, 

Ecco il file script.js.map è il nome del file di origine mappa generata dal concat compito. Come inputSourceMap opzione eccettua un oggetto della mappa di origine, passiamo in utilizzando il metodo della grunt.file API readJSON

La configurazione completa del file Grunt sarebbe: progetto

concat: { 
     options: { 
      sourceMap: true 
     }, 
     js: { 
      src: ['Modules/**/js/*.js'], 
      dest: 'script.js' 
     } 
    }, 
    babel: { 
     dist: { 
      options: { 
       sourceMap: true, 
       inputSourceMap: grunt.file.readJSON('script.js.map') 
      }, 
      src: [ 
       'script.js', 
      ], 
      dest: 'app.js' 
     } 
    } 

Esempio: https://github.com/pra85/Grunt-Concat-Babel-Example

+2

Funziona, grazie. Quello che dovevo fare per farlo funzionare in Visual Studio Corse era cambiare: inputSourceMap: function() { if (grunt.file.exists ('../ concatinated-es6.js.map')) { return grunt.file.readJSON ('concatinated-es6.js.map') } return ''; }() In caso contrario l'elenco delle attività si arresterebbe in modo anomalo. – Todilo

+10

Principalmente funzionante, il file Grunt continuava a cercare di leggere la mappa sorgente prima che venisse generato. Per risolvere questo problema, ho registrato un'attività personalizzata che viene eseguita tra concat e babel che aggiunge l'opzione 'inputSourceMap' a babel config. Rendere il mio Gruntfile.js simile a questa: http://jsbin.com/rijazetaxe/3/edit?js – BenJamin

+0

Secondo [codice sorgente babel] (https://github.com/babel/babel/blob/e44cef34734b59d26b2f090acd7ab16d5570b05c/ pacchetti/babel-core/src/transformation/normalize-file.js # L29), analizzando la mappa sorgente json non è più necessario. Babel analizzerà sempre il commento della mappa sorgente dall'output concat, a condizione che 'inputSourceMap' sia true. Ancora peggio, ignorerà qualsiasi valore se trova un commento sulla mappa di origine, che è sempre il caso qui. Di conseguenza, questo probabilmente non farà quello che ti aspetti. – user8808265

Problemi correlati