2015-03-11 21 views
24

Sto cercando di eseguire Karma-babel-preprocessor e un dritto generatore avanti ES6:RegeneratorRuntime non è definito

//require('babel/polyfill'); 

    describe("how Generators work", function() { 
    it("will allow generator functions", function() { 
     /*function * numbers() { 
     yield 1; 
     yield 2; 
     yield 3; 
     };*/ 


     let numbers = { 
     [Symbol.iterator]:function*(){ 
      yield 1; 
      yield 2; 
      yield 3; 
      } 
     } 

     let sum = 0; 

     for(n of numbers){ 
     sum += n; 
     } 

     expect(sum).toBe(6); 
    }); 
    }); 

Da questo ho generato i miei file di test (ES6 => ES5) con Babel:

babel src --watch --out-dir tests

Poi corro karma start ottengo l'errore:

ReferenceError: regeneratorRuntime is not defined".

bit rilevanti in karma.conf.js:

// list of files/patterns to load in the browser 
    files: [ 
     'test-main.js', 
     {pattern: 'tests/*.js', included: true} 
    ], 


    // list of files to exclude 
    exclude: [ 
    ], 


    // preprocess matching files before serving them to the browser 
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 
    preprocessors: { 
      'src/*.js': ['babel'] 
    }, 
     'babelPreprocessor': { 
     options: { 
     sourceMap: 'inline' 
     }, 
     filename: function(file) { 
     return file.originalPath.replace(/\.js$/, '.es5.js'); 
     }, 
     sourceFileName: function(file) { 
     return file.originalPath; 
     } 
    }, 


// test results reporter to use 
// possible values: 'dots', 'progress' 
// available reporters: https://npmjs.org/browse/keyword/karma-reporter 
reporters: ['progress'], 

Full project on github

io sono in grado di utilizzare molte funzioni tra cui ES6 frecce. Basta non andare su Generatori.

risposta

20

Mentre sto adottando un approccio diverso ** per usare Karma con Babel nel mio progetto, sospetto che tu stia avendo lo stesso problema che avevo io: lo Babel polyfill non viene caricato, quindi non stai ricevendo il funzionalità supportata (incluso il runtime del rigeneratore personalizzato che Babel usa per far funzionare i generatori).

Un approccio potrebbe essere quello di trovare un modo per includere la polyfill, forse alimentando al Karma tramite l'array file:

files: [ 
    'path/to/browser-polyfill.js', // edited: polyfill => browser-polyfill per P.Brian.Mackey's answer 
    ... 

Un approccio alternativo potrebbe essere quello di utilizzare runtime transformer [modifica di Babel: sulla rilettura i documenti, questo non funzionerà se non si quindi browserify/webpack/etc. per elaborare le chiamate require() create dal trasformatore]; per i suoi documenti,

The runtime optional transformer does three things:

  • Automatically requires babel-runtime/regenerator when you use generators/async functions.
  • Automatically requires babel-runtime/core-js and maps ES6 static methods and built-ins.
  • Removes the inline babel helpers and uses the module babel-runtime/helpers instead.

non ho alcuna esperienza con questo, ma ho il sospetto che ci si farlo includendo l'opzione optional: ['runtime'] dalla documentazione Babel nel babelPreprocessor configurazione, vale a dire .:

'babelPreprocessor': { 
    options: { 
    optional: ['runtime'], // per http://babeljs.io/docs/usage/options/ 
    sourceMap: 'inline' 
    }, 
... 

(** attualmente sto usando JSPM + JSPM-karma + qualche config per ottenere il polyfill Babel per caricare SystemJS;. chiedere se pertinenti e mi espongo)

+1

Ho provato entrambe le opzioni. Nessuno dei due ha funzionato per me. Ho aggiunto 'node_modules/babel/polyfill.js' e Error:' Uncaught ReferenceError: module is not defined'. Credo che si riferisca alla singola riga in questo file che contiene 'module'. Ho aggiunto sempre più directory dir/* .js e ci sono riuscito ancora di più con niente. La seconda opzione che hai elencato sembra non avere alcun impatto, lo stesso errore. –

+1

La tua risposta è molto vicina e certamente mi ha messo sulla strada giusta. Ci sono alcuni problemi, quindi ho inviato una risposta per aiutarli a identificarli. –

+0

Fantastico! Ho modificato il percorso di polyfill nella mia risposta per evitare di confondere gli altri. – Martin

3

ho modificato karma.conf.js aggiungere 0.123.come menzionato nel Docs Link:

files: [ 
      'node_modules/babel/browser-polyfill.js', 
     'test-main.js', 
     {pattern: 'tests/*.js', included: true} 
    ], 

Dopo questa modifica, il seguente test unità funziona in Karma:

describe("how Generators work", function() { 
    it("will allow generator functions", function() { 
    /*function* numbers(){ 
     yield 1; 
     yield 2; 
     yield 3; 
    };*///Simplified syntax does not work 

     let numbers = { 
     [Symbol.iterator]:function*(){ 
      yield 1; 
      yield 2; 
      yield 3; 
      } 
     } 

     let sum = 0; 

     for(let num of numbers){ 
     sum += num; 
     } 

     expect(sum).toBe(6); 
    }); 
    }); 
+0

come è il tuo intero karma.conf? – JerryFox

33

Nodo js Env - aggiornato dicembre 2015

Questo la domanda è già stata risolta, si prega di consultare la risposta accettata A MENO che sia in esecuzione nell'ambiente NodeJS.

Se come me, hai avuto lo stesso messaggio di errore: 'ReferenceError: regeneratorRuntime non è definito' ma correvi Babel in un ambiente NodeJS, poi semplicemente facendo la seguente sarà probabilmente risolvere il problema:

npm install babel-polyfill --save 

quindi inserire il seguente richiedono dichiarazione verso la parte superiore del modulo interessato avere richiesto (generatore) comportamento:

require("babel-polyfill"); 

Questo dovrebbe essere tutto è necessario, basta importare il modulo per aggiungere il comportamento richiesto di polyfill in fase di esecuzione.

+0

Stavo cercando di ottenere [FuseBox] (http://fuse-box.org/) che lavora per raggruppare un'app React e ho dovuto farlo per farlo funzionare correttamente. –