RegeneratorRuntime не определен
Я пытаюсь запустить Karma-babel-preprocessor и прямой генератор ES6:
//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);
});
});
Из этого я сгенерировал свои тестовые файлы (ES6 = > ES5) с помощью babel:
babel src --watch --out-dir tests
Затем я запускаю karma start
Я получаю ошибку:
ReferenceError: регенераторRuntime не определен ".
Соответствующие биты в файле 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'],
Полный проект по github
Я могу использовать многие функции ES6, включая стрелки. Просто не двигайтесь к генераторам.
Ответы
Ответ 1
Хотя я использую другой подход ** к использованию Karma с Babel в моем проекте, я подозреваю, что у вас возникла та же проблема, что и у меня: Babel Polyfill не загружается, и поэтому вы не получает поддерживаемых функций (включая пользовательскую среду выполнения регенератора, которую Babel использует для работы генераторов).
Один из подходов состоит в том, чтобы найти способ включить полифилл, возможно, передав его в Карму через массив файлов:
files: [
'path/to/browser-polyfill.js', // edited: polyfill => browser-polyfill per P.Brian.Mackey answer
...
Альтернативный подход может заключаться в использовании Baba среды выполнения [править: при перечитывании документов это не будет работать, пока вы не просмотрите /webpack/etc. обрабатывать вызовы require()
, созданные преобразователем]; согласно документам,
Дополнительный трансформатор runtime
выполняет три действия:
- Автоматически требует
babel-runtime/regenerator
, когда вы используете генераторы/асинхронные функции.
- Автоматически требует
babel-runtime/core-js
и отображает статические методы и встроенные модули ES6.
- Удаляет встроенные помощники Babel и вместо этого использует
module babel-runtime/helpers
.
У меня нет опыта работы с этим, но я подозреваю, что вы бы сделали это, включив опцию optional: ['runtime']
из документации Babel в конфигурацию babelPreprocessor
, а именно:
'babelPreprocessor': {
options: {
optional: ['runtime'], // per http://babeljs.io/docs/usage/options/
sourceMap: 'inline'
},
...
(** В настоящее время я использую jspm + jspm-karma + некоторую конфигурацию для загрузки полифилла Babel для загрузки в SystemJS; спросите, если это уместно, и я изложу.)
Ответ 2
Node js Env - обновленный декабрь 2015
На этот вопрос уже был дан ответ, см. принятый ответ UNLESS, работающий в среде NodeJS.
Как и у меня, у вас было такое же сообщение об ошибке: 'ReferenceError: restoreatorRuntime не определен', но они запускали Babel в среде NodeJS, тогда простое выполнение, скорее всего, решит вашу проблему:
npm install babel-polyfill --save
Затем вставьте следующую инструкцию require в верхнюю часть затронутого модуля для получения требуемого (генераторного) поведения:
require("babel-polyfill");
Это должно быть все, что вам нужно, просто импортирование модуля добавляет требуемое поведение polyfill во время выполнения.
Ответ 3
Как и в сообщении arcseldon, я запускал Babel в среде NodeJS и получал то же сообщение об ошибке "ReferenceError: Регенератор не определен". Пока установка babel-polyfill работает, я выбрал @babel/plugin-transform-runtime.
@Столпотворение/плагин-преобразование-среда
Он должен быть установлен двумя способами... сначала как зависимость от разработчика:
npm install --save-dev @babel/plugin-transform-runtime
и второе как производственная зависимость:
npm install --save @babel/runtime
А затем нужно добавить в файл .babelrc одно простое дополнение:
{
"plugins": ["@babel/plugin-transform-runtime"]
}
Эти дополнения предоставляют функциональность авторинга ES6 без ReferenceError.
Ответ 4
Я изменил karma.conf.js
, чтобы добавить browser-polyfill
как упомянутый в Docs Link:
files: [
'node_modules/babel/browser-polyfill.js',
'test-main.js',
{pattern: 'tests/*.js', included: true}
],
После этой модификации в карме работает unit test:
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);
});
});
Ответ 5
Если вы используете React, добавление полифилов из create-react-app
сработало для меня.
yarn add --dev react-app-polyfill
Затем добавьте следующие строки в webpack.config.js
entry: {
app: [
'react-app-polyfill/ie9', // Only if you want to support IE 9
'react-app-polyfill/stable',
'./src/index.jsx',
],
},
См. больше примеров на странице act-app-polyfill GitHub.