RegeneratorRuntime n'est pas défini

J'essaie d'exécuter Karma-babel-preprocessor et un générateur ES6 simple:

//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);
    });
  });

À partir de là, j'ai généré mes fichiers de test (ES6 => ES5) avec babel:

babel src --watch --out-dir tests

Ensuite, je cours karma start j'obtiens une erreur:

ReferenceError: regeneratorRuntime n'est pas défini".

Bits pertinents dans le 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'],

Plein de projet sur github

Je suis capable d'utiliser de nombreuses fonctionnalités ES6, y compris les flèches. Simplement pas aller sur Générateur.

24
demandé sur Hugo Dozois 2015-03-11 03:54:17

3 réponses

Alors que je prends une approche différente** pour utiliser Karma avec Babel dans mon projet, je soupçonne que vous rencontrez le même problème que moi: le Babel polyfill n'est pas chargé, et donc vous n'obtenez pas la fonctionnalité qu'il prend en charge (y compris le runtime regenerator personnalisé que Babel utilise pour faire fonctionner les générateurs).

Une approche serait de trouver un moyen d'inclure le polyfill, peut-être en l'alimentant au Karma via le tableau files:

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

Une autre approche peut être d'utiliser le transformateur d'exécution de Babel [edit: lors de la relecture des documents, cela ne fonctionnera pas sauf si vous naviguez ensuite / webpack / etc. pour traiter les appels require() créés par le transformateur ]; selon ses documents,

Le transformateur optionnel runtime fait trois choses:

  • nécessite automatiquement babel-runtime/regenerator lorsque vous utilisez des générateurs / fonctions asynchrones.
  • nécessite automatiquement babel-runtime/core-js et mappe les méthodes statiques ES6 et les built-ins.
  • supprime le inline Babel helpers et utilise le module babel-runtime/helpers à la place.

Je n'ai aucune expérience avec cela, mais je soupçonne que vous le feriez en incluant l'option optional: ['runtime'] des documents Babel dans votre babelPreprocessor config, à savoir.:

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

(** j'utilise actuellement jspm + jspm-karma + quelques config pour charger le polyfill Babel dans SystemJS; demandez si pertinent et je vais exposer.)

20
répondu Martin 2015-03-11 19:12:41

Node Js Env-mise à jour décembre 2015

cette question a déjà été répondue, veuillez voir la réponse acceptée sauf si elle s'exécute dans L'environnement NodeJS.

Si comme moi, vous aviez le même message d'erreur: 'ReferenceError: regeneratorRuntime n'est pas défini' mais exécutez Babel dans un environnement NodeJS, alors simplement faire ce qui suit résoudra probablement votre problème:

npm install babel-polyfill --save

Insérez ensuite l'instruction require suivante vers le haut du module affecté pour obtenir le comportement requis (générateur):

require("babel-polyfill");

Cela devrait être tout ce dont vous avez besoin, il suffit d'importer le module pour ajouter le comportement polyfill requis à l'exécution.

36
répondu arcseldon 2015-12-25 12:49:13

J'ai modifié karma.conf.js pour ajouter browser-polyfill, comme mentionné dans le Docs Lien:

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

Après cette modification, le test unitaire suivant fonctionne dans 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);
    });
  });
3
répondu P.Brian.Mackey 2017-04-14 10:20:46