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'],
Je suis capable d'utiliser de nombreuses fonctionnalités ES6, y compris les flèches. Simplement pas aller sur Générateur.
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.)
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.
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);
});
});