Я пытаюсь настроить проект 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
.