2016-12-22 5 views
2

Я пытаюсь настроить проект Webpack-Babel-JavaScript. Он продолжает терпеть неудачу, если как функция async, так и функция генератора определены в источнике в этом порядке. Если порядок определений функций изменен, он работает правильно. Что вызывает эту проблему? Есть ли способ, как использовать как асинхронные, так и генераторные функции в произвольном порядке с babel?babel: ReferenceError: _regeneratorRuntime не определен

Проект использует async-to-generator плагин babel для преобразования асинхронных функций в генераторы и плагин transform-runtime для преобразования функций генератора. Я бы предпочел использовать babel-runtime для babel-polyfill.

Сообщение об ошибке:

/tmp/babel-demo/dist/main.bundle.js:8231 
    var _marked = [foo].map(_regeneratorRuntime.mark); 
          ^

ReferenceError: _regeneratorRuntime is not defined 
    at Object.<anonymous> (/tmp/babel-demo/dist/main.bundle.js:8231:26) 
    at __webpack_require__ (/tmp/babel-demo/dist/main.bundle.js:30:30) 
    at Object.<anonymous> (/tmp/babel-demo/dist/main.bundle.js:58:19) 
    at __webpack_require__ (/tmp/babel-demo/dist/main.bundle.js:30:30) 
    at /tmp/babel-demo/dist/main.bundle.js:50:18 
    at /tmp/babel-demo/dist/main.bundle.js:53:10 
    at webpackUniversalModuleDefinition (/tmp/babel-demo/dist/main.bundle.js:3:20) 
    at Object.<anonymous> (/tmp/babel-demo/dist/main.bundle.js:10:3) 
    at Module._compile (module.js:571:32) 
    at Object.Module._extensions..js (module.js:580:10) 

Структура проекта (download project):

. 
├── .babelrc 
├── .gitignore 
├── package.json 
├── src 
│   └── main.js 
└── webpack.config.js 

main.js

async function bar(p) { 
} 

function* foo(p) { 
} 

Команда используется для повторной компиляции и запуска файла: rm -rf dist && npm run build && node -p 'c = require(\"./dist/main.bundle.js\"); console.log(c)'.

рабочих main.js (функции меняются местами)

function* foo(p) { 
} 

async function bar(p) { 
} 

.babelrc

{ 
    "presets": ["es2015"], 
    "plugins": [ "transform-async-to-generator", ["transform-runtime", { 
     "helpers": false, 
     "polyfill": false, 
     "regenerator": true}]] 
} 

webpack.config.js

module.exports = { 
    entry: { 
     main: ['babel-polyfill', './src/main.js'] 
    }, 
    output: { 
     path: './dist', 
     filename: "[name].bundle.js", 
     publicPath: '/', 
     libraryTarget: 'umd' 
    }, 
    module: { 
     loaders: [ 
      { 
       test: /\.js$/, 
       exclude: /node_modules/, 
       loader: 'babel-loader' 
      } 
     ], 
    } 
}; 

package.json

{ 
    "name": "babel-demo", 
    "version": "1.0.0", 
    "scripts": { 
    "build": "webpack", 
    "test": "rm -rf dist && webpack && node -p 'c = require(\"./dist/main.bundle.js\"); console.log(c)'" 
    }, 
    "license": "ISC", 
    "devDependencies": { 
    "babel-cli": "^6.18.0", 
    "babel-core": "^6.21.0", 
    "babel-loader": "^6.2.10", 
    "babel-plugin-transform-async-to-generator": "^6.16.0", 
    "babel-plugin-transform-runtime": "^6.15.0", 
    "babel-preset-es2015": "^6.18.0", 
    "webpack": "^1.14.0" 
    } 
} 

Похоже, что в модуле 300 transpilled file (начиная с строки 8256) определяется глобальная переменная regeneratorRuntime. Однако в случае неудачной строки 8231 по какой-то причине ожидается _regeneratorRuntime.

ответ

0

У меня была аналогичная проблема (_regeneratorRuntime not defined), которая произошла только тогда, когда сборка была произведена в среде со старым узлом (в этом случае это был узел v4.4.0 на сервере сборки). На момент написания настоящего документа текущая версия стабильного узла - v7.9, которая создала рабочую сборку.

я был в состоянии решить без обновления (как TMP исправление), устраняя некоторые генератор или/и ES6 Polyfill методы:

  • перевождь сага running in parallel синтаксис
  • с помощью генераторов и любой из ES6 Polyfill методы (Array.find, JSON.x, Promise) в том же файле

 Смежные вопросы

  • Нет связанных вопросов^_^