Подтвердить что ты не робот

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, включая стрелки. Просто не двигайтесь к генераторам.

4b9b3361

Ответ 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.