Babel 6 регенератор Runtime не определен
Я пытаюсь использовать async, жду с нуля на Babel 6, но я получаю регенератор. Время не определено.
файл.babelrc
{
"presets": [ "es2015", "stage-0" ]
}
файл package.json
"devDependencies": {
"babel-core": "^6.0.20",
"babel-preset-es2015": "^6.0.15",
"babel-preset-stage-0": "^6.0.15"
}
файл.js
"use strict";
async function foo() {
await bar();
}
function bar() { }
exports.default = foo;
Использование его обычно без async/await работает просто отлично. Есть идеи, что я делаю не так?
48 ответов
babel-polyfill
необходимо. Вы также должны установить его, чтобы заставить работать async/await.
npm i -D babel-core babel-polyfill babel-preset-es2015 babel-preset-stage-0 babel-loader
package.json
"devDependencies": {
"babel-core": "^6.0.20",
"babel-polyfill": "^6.0.16",
"babel-preset-es2015": "^6.0.15",
"babel-preset-stage-0": "^6.0.15"
}
.babelrc
{
"presets": [ "es2015", "stage-0" ]
}
.js с async/await (пример кода)
"use strict";
export default async function foo() {
var s = await bar();
console.log(s);
}
function bar() {
return "bar";
}
В файле запуска
require("babel-core/register");
require("babel-polyfill");
Если вы используете веб-пакет, вы должны поместить его в качестве первой записи в соответствии с комментарием @Cemen:
module.exports = {
entry: ['babel-polyfill', './test.js'],
output: {
filename: 'bundle.js'
},
module: {
loaders: [
{ test: /\.jsx?$/, loader: 'babel', }
]
}
};
Если вы хотите запустить тесты с babel, используйте:
mocha --compilers js:babel-core/register --require babel-polyfill
Помимо polyfill, я использую http://babeljs.io/docs/plugins/transform-runtime/. Плагин описывается как:
Выводите ссылки на помощники и встроенные функции, автоматически заполняя ваш код, не загрязняя глобальные переменные. Что это на самом деле означает, хотя? По сути, вы можете использовать встроенные модули, такие как Promise, Set, Symbol и т. Д., А также использовать все функции Babel, которые требуют бесшовного заполнения, без глобального загрязнения, что делает его чрезвычайно подходящим для библиотек.
Он также включает поддержку async/await и других встроенных функций ES 6.
$ npm install --save-dev babel-plugin-transform-runtime
В .babelrc
добавить плагин времени выполнения
{
"plugins": [
["transform-runtime", {
"polyfill": false,
"regenerator": true
}]
]
}
Babel 7 пользователей
У меня были некоторые проблемы с этим, так как большая часть информации была для предыдущих версий Babel. Для Babel 7 установите эти две зависимости:
npm install --save @babel/runtime
npm install --save-dev @babel/plugin-transform-runtime
И в.babelrc добавьте:
{
"presets": ["@babel/preset-env"],
"plugins": [
["@babel/transform-runtime"]
]
}
Обновить
Это работает, если вы установите цель в Chrome. Но это может не работать для других целей, пожалуйста, обратитесь к: https://github.com/babel/babel-preset-env/issues/112
Так что этот ответ НЕ совсем подходит для исходного вопроса. Я буду держать это здесь как ссылку на babel-preset-env
,
Простое решение - добавить import 'babel-polyfill'
в начале вашего кода.
Если вы используете веб-пакет, быстрое решение заключается в добавлении babel-polyfill
как показано ниже:
entry: {
index: ['babel-polyfill', './index.js']
}
Я полагаю, что нашел последнюю лучшую практику.
Проверьте этот проект: https://github.com/babel/babel-preset-env
yarn add --dev babel-preset-env
Используйте следующую конфигурацию вашего babel:
{
"presets": [
["env", {
"targets": {
"browsers": ["last 2 Chrome versions"]
}
}]
]
}
Тогда ваше приложение должно хорошо работать в последних 2 версиях браузера Chrome.
Вы также можете установить Node в качестве цели или настроить список браузеров в соответствии с https://github.com/ai/browserslist
Скажи мне что, не говори мне как.
мне действительно нравится babel-preset-env
Философия: скажи мне, какую среду ты хочешь поддерживать, НЕ говори мне, как их поддерживать. Это красота декларативного программирования.
Я проверял async
await
и они работают. Я не знаю, как они работают, и я действительно не хочу знать. Вместо этого я хочу тратить свое время на собственный код и свою бизнес-логику. Благодаря babel-preset-env
, это освобождает меня от ада Вавилонской конфигурации.
Обновление: сообщение Babel 7 также содержит более подробный ответ.
Babel 7.4.0 или новее (core-js 2 / 3)
Начиная с Babel 7.4.0,@babel/polyfill
является устаревшим.
В общем, есть два способа установить полифилы / регенератор: через глобальное пространство имен (Вариант 1) или как ponyfill (Вариант 2, без глобального загрязнения).
Опция 1: @babel/preset-env
presets: [
["@babel/preset-env", {
"useBuiltIns": "usage",
"corejs": 3, // or 2,
"targets": {
"firefox": "64", // or whatever target to choose .
},
}]
]
будет автоматически использовать regenerator-runtime
а также core-js
согласно вашей цели. Не нужно ничего импортировать вручную. Не забудьте установить зависимости времени выполнения:
npm i --save regenerator-runtime core-js
В качестве альтернативы установите useBuiltIns: "entry"
и импортируем вручную:
import "regenerator-runtime/runtime";
import "core-js/stable"; // if polyfills are also needed
Вариант 2: @babel/transform-runtime
с @babel/runtime
Эта альтернатива не имеет загрязнения глобальной области и подходит для библиотек.
{
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"regenerator": true,
"corejs": 3 // or 2; if polyfills needed
...
}
]
]
}
Установите его:npm i -D @babel/plugin-transform-runtime
npm i @babel/runtime
Если corejs
используется polyfill, вы заменяете @babel/runtime
с @babel/runtime-corejs2
(за "corejs": 2
) или @babel/runtime-corejs3
(за "corejs": 3
).
Кроме того, если вам не нужны все модули babel-polyfill
обеспечивает, вы можете просто указать babel-regenerator-runtime
в вашей конфигурации веб-пакета:
module.exports = {
entry: ['babel-regenerator-runtime', './test.js'],
// ...
};
При использовании webpack-dev-server с HMR это значительно уменьшило количество файлов, которые приходится компилировать в каждой сборке. Этот модуль установлен как часть babel-polyfill
так что если у вас уже есть все в порядке, в противном случае вы можете установить его отдельно с npm i -D babel-regenerator-runtime
,
Эта ошибка возникает, когда async/await
функции используются без соответствующих плагинов Babel. По состоянию на март 2020 года все, что вам нужно сделать, должно быть ниже. (@babel/polyfill
и многие из принятых решений устарели в Babel. Подробнее читайте в документации Babel.)
В командной строке введите:
npm install --save-dev @babel/plugin-transform-runtime
В вашем babel.config.js
файл, добавьте этот плагин @babel/plugin-transform-runtime
. Примечание. В приведенном ниже примере представлены другие пресеты и плагины, которые у меня есть для небольшого проекта React/Node/Express, над которым я недавно работал:
module.exports = {
presets: ['@babel/preset-react', '@babel/preset-env'],
plugins: ['@babel/plugin-proposal-class-properties',
'@babel/plugin-transform-runtime'],
};
Мое простое решение:
npm install --save-dev babel-plugin-transform-runtime
npm install --save-dev babel-plugin-transform-async-to-generator
.babelrc
{
"presets": [
["latest", {
"es2015": {
"loose": true
}
}],
"react",
"stage-0"
],
"plugins": [
"transform-runtime",
"transform-async-to-generator"
]
}
babel-regenerator-runtime
теперь устарела, вместо этого следует использовать regenerator-runtime
,
Использовать генератор времени выполнения с webpack
а также babel
v7:
устанавливать regenerator-runtime
:
npm i -D regenerator-runtime
А затем добавьте в конфигурацию веб-пакета:
entry: [
'regenerator-runtime/runtime',
YOUR_APP_ENTRY
]
Обновите свой .babelrc
файл в соответствии со следующими примерами, он будет работать.
Если вы используете @babel/preset-env
пакет
{
"presets": [
[
"@babel/preset-env", {
"targets": {
"node": "current"
}
}
]
]
}
or if you are using babel-preset-env package
{
"presets": [
[
"env", {
"targets": {
"node": "current"
}
}
]
]
}
По состоянию на октябрь 2019 года это сработало для меня:
Добавьте это в предустановку.
"presets": [
"@babel/preset-env"
]
Затем установите регенераторную среду выполнения с помощью npm.
npm i regenerator-runtime
И затем в вашем основном файле используйте: (этот импорт используется только один раз)
import "regenerator-runtime/runtime";
Это позволит вам использовать async
awaits
в вашем файле и удалите regenerator error
Будьте осторожны с подъемными функциями
У меня был и мой "импорт многозаполнения", и моя "асинхронная функция" в одном и том же файле, однако я использовал синтаксис функции, который поднимает ее над полифиллом, что дает мне ReferenceError: regeneratorRuntime is not defined
ошибка.
Изменить этот код
import "babel-polyfill"
async function myFunc(){ }
к этому
import "babel-polyfill"
var myFunc = async function(){}
чтобы он не поднимался над импортом полифилл.
Я использовал подсказку с https://github.com/babel/babel/issues/9849#issuecomment-592668815 и добавил
targets: { esmodules: true,}
к моему
babel.config.js
.
module.exports = {
presets: [
[
'@babel/preset-env',
{
targets: {
esmodules: true,
},
},
],
],
}
У меня была эта проблема в Chrome. Как и в ответе RienNeVaPlu, это решило это для меня:
npm install --save-dev regenerator-runtime
Тогда в моем коде:
import 'regenerator-runtime/runtime';
Рад избежать лишних 200 кБ от babel-polyfill
,
При использовании babel-preset-stage-2
тогда просто нужно запустить скрипт с --require babel-polyfill
,
В моем случае эта ошибка была сброшена Mocha
тесты.
После исправлена проблема
mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill
Вы получаете ошибку, потому что асинхронные / ожидающие используют генераторы, которые являются функцией ES2016, а не ES2015. Один из способов исправить это - установить предустановку Babel для ES2016 (npm install --save babel-preset-es2016
) и скомпилируйте в ES2016 вместо ES2015:
"presets": [
"es2016",
// etc...
]
Как упоминалось в других ответах, вы также можете использовать полифилы (хотя убедитесь, что вы загружаете полифилл сначала, прежде чем будет запущен любой другой код). В качестве альтернативы, если вы не хотите включать все зависимости polyfill, вы можете использовать babel-Регенератор-время выполнения или babel-plugin-transform-runtime.
Я начал получать эту ошибку после преобразования моего проекта в проект машинописного текста. Из того, что я понимаю, проблема заключается в том, что async/await не распознается.
Для меня ошибка была исправлена добавлением двух вещей в мою настройку:
Как уже упоминалось выше, мне нужно было добавить babel-polyfill в мой массив записей webpack:
... запись: ['babel-polyfill', './index.js'], ...
Мне нужно было обновить мой.babelrc, чтобы разрешить компиляцию async/await в генераторы:
{ "пресеты": ["es2015"], "plugins": ["transform-async-to-generator"] }
DevDependencies:
Мне пришлось установить несколько вещей в мои devDependencies в моем файле package.json. А именно, мне не хватало babel-plugin-transform-async-to-generator, babel-polyfill и babel-preset-es2015:
"devDependencies": {
"babel-loader": "^6.2.2",
"babel-plugin-transform-async-to-generator": "^6.5.0",
"babel-polyfill": "^6.5.0",
"babel-preset-es2015": "^6.5.0",
"webpack": "^1.12.13"
}
Полный код Gist:
Я получил код от действительно полезной и лаконичной GitHub-гистики, которую вы можете найти здесь.
Я исправил эту ошибку, установив babel-polyfill
npm install babel-polyfill --save
затем я импортировал его в точку входа моего приложения
import http from 'http';
import config from 'dotenv';
import 'babel-polyfill';
import { register } from 'babel-core';
import app from '../app';
для тестирования я включил --require babel-polyfill в свой тестовый скрипт
"test": "export NODE_ENV=test|| SET NODE_ENV=test&& mocha --compilers
js:babel-core/register --require babel-polyfill server/test/**.js --exit"
Там так много ответов, что я отправлю свой ответ для справки. Я использую webpack и реагирую, вот мое решение без файла.babelrc
Я работаю над этим в августе 2020 года
Установите React и Babel
npm i @babel/core babel-loader @babel/preset-env @babel/preset-react react react-dom @babel/plugin-transform-runtime --save-dev
Затем в моем webpack.config.js
// other stuff
module.exports = {
// other stuff
module: {
rules: [
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env',"@babel/preset-react"],
plugins: ['@babel/plugin-proposal-class-properties', '@babel/plugin-transform-runtime'],
//npm install --save-dev @babel/plugin-transform-runtime
}
}
},
],
},
};
Я просто не знаю, почему мне пока не нужно устанавливать пакет async
Новый ответ Почему вы следуете моему ответу?
Ответ: Потому что я собираюсь дать вам ответ с последней версией Обновления проекта npm.
04/14/2017
"name": "es6",
"version": "1.0.0",
"babel-core": "^6.24.1",
"babel-loader": "^6.4.1",
"babel-polyfill": "^6.23.0",
"babel-preset-es2015": "^6.24.1",
"webpack": "^2.3.3",
"webpack-dev-server": "^2.4.2"
Если вы используете эту версию или более UP версию Npm и все другие... ТАК просто нужно изменить:
webpack.config.js
module.exports = {
entry: ["babel-polyfill", "./app/js"]
};
После изменения webpack.config.js
файлы Просто добавьте эту строку в начало вашего кода.
import "babel-polyfill";
Теперь проверьте, все ли в порядке. Ссылка ССЫЛКА
Также спасибо @BrunoLM за его хороший ответ.
Самый простой способ исправить эту "проблему с регенератором Runtime не определена" в консоли:
Вам не нужно устанавливать ненужные плагины. Просто добавь:
<script src="https://unpkg.com/regenerator-runtime@0.13.1/runtime.js"></script>
внутри тела в вашем index.html. Теперь после запуска babel необходимо определить регенераторВремя выполнения, и теперь ваши функции async/await должны быть успешно скомпилированы в ES2015.
Целевые браузеры, которые мне нужно поддерживать, уже поддерживают async / await, но при написании тестов mocha без правильной настройки я все еще получал эту ошибку.
Большинство статей, которые я гуглил, устарели, включая принятый ответ и ответы с высоким рейтингом здесь, т.е. вам не нужно polyfill
, babel-regenerator-runtime
, babel-plugin-transform-runtime
, и т. д., если ваш целевой браузер (-ы) уже поддерживает async / await (конечно, если вам не нужен polyfill)
Я не хочу использовать webpack
или.
Ответ Тайлера Лонга на правильном пути, так как он предложил babel-preset-env
(но я опустил это сначала, так как он упомянул полифилл в начале). Я все еще получил ReferenceError: regeneratorRuntime is not defined
сначала я понял, что это потому, что я не поставил цель. После установки цели для узла я исправляю ошибку регенератора:
"scripts": {
//"test": "mocha --compilers js:babel-core/register"
//https://github.com/mochajs/mocha/wiki/compilers-deprecation
"test": "mocha --require babel-core/register"
},
"devDependencies": {
"babel-core": "^6.26.3",
"babel-preset-env": "^1.7.0",
"mocha": "^5.2.0"
},
//better to set it .bablerc, I list it here for brevity and it works too.
"babel": {
"presets": [
["env",{
"targets": {
"node": "current"
"chrome": 66,
"firefox": 60,
},
"debug":true
}]
]
}
Мой рабочий шаблон babel 7 для реакции со средой выполнения регенератора:
.babelrc
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": true,
},
},
],
"@babel/preset-react",
],
"plugins": [
"@babel/plugin-syntax-class-properties",
"@babel/plugin-proposal-class-properties"
]
}
package.json
...
"devDependencies": {
"@babel/core": "^7.0.0-0",
"@babel/plugin-proposal-class-properties": "^7.4.4",
"@babel/plugin-syntax-class-properties": "^7.2.0",
"@babel/polyfill": "^7.4.4",
"@babel/preset-env": "^7.4.5",
"@babel/preset-react": "^7.0.0",
"babel-eslint": "^10.0.1",
...
main.js
import "@babel/polyfill";
....
Просто установите регенератор-среду выполнения с помощью команды ниже
npm i regenerator-runtime
добавьте строку ниже в файл запуска, прежде чем вам потребуется файл сервера
require("regenerator-runtime/runtime");
Пока это работает для меня
Для людей, которые хотят использовать babel-polyfill
версия 7^ сделать это с webpack
ver3 ^.
Npm установить модуль npm i -D @babel/polyfill
Тогда в вашем webpack
файл в вашем entry
Дык сделать это
entry: ['@babel/polyfill', path.resolve(APP_DIR, 'App.js')],
Я получаю эту ошибку, используя gulp with rollup, когда я пытался использовать генераторы ES6:
gulp.task('scripts', () => {
return rollup({
entry: './app/scripts/main.js',
format: "iife",
sourceMap: true,
plugins: [babel({
exclude: 'node_modules/**',
"presets": [
[
"es2015-rollup"
]
],
"plugins": [
"external-helpers"
]
}),
includePaths({
include: {},
paths: ['./app/scripts'],
external: [],
extensions: ['.js']
})]
})
.pipe(source('app.js'))
.pipe(buffer())
.pipe(sourcemaps.init({
loadMaps: true
}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('.tmp/scripts'))
.pipe(reload({ stream: true }));
});
Я могу на случай, если решение будет включать babel-polyfill
в качестве компонента беседки:
bower install babel-polyfill --save
и добавьте его в качестве зависимости в index.html:
<script src="/bower_components/babel-polyfill/browser-polyfill.js"></script>
1 - Установить метод babel-plugin-transform-async-to-module, babel-polyfil, bluebird, babel-preset-es2015, babel-core:
npm install babel-plugin-transform-async-to-module-method babel-polyfill bluebird babel-preset-es2015 babel-core
2 - Добавьте в свой js babel polyfill:
import 'babel-polyfill';
3 - Добавьте плагин в ваш.babelrc:
{
"presets": ["es2015"],
"plugins": [
["transform-async-to-module-method", {
"module": "bluebird",
"method": "coroutine"
}]
]
}
Источник: http://babeljs.io/docs/plugins/transform-async-to-module-method/
У меня была настройка
с использованием веб-пакета presets: ['es2015', 'stage-0']
и mocha, который выполнял тесты, скомпилированные webpack.
Чтобы сделать мой async/await
в тестовой работе все, что мне нужно было сделать, это добавить mocha --require babel-polyfill
вариант.
Для пользователей babel7 и ParcelJS >= 1.10.0 пользователей
npm i @babel/runtime-corejs2
npm i --save-dev @babel/plugin-transform-runtime @babel/core
.babelrc
{
"plugins": [
["@babel/plugin-transform-runtime", {
"corejs": 2
}]
]
}
взято с https://github.com/parcel-bundler/parcel/issues/1762
Если вы используете следующий js, добавьте
import regeneratorRuntime from "regenerator-runtime";
к файлу, который вызывает ошибку, для меня файл был
_document.js
.
и добавить
[
"@babel/plugin-transform-regenerator",
{
"asyncGenerators": false,
"generators": false,
"async": false
}
]
в
plugins
, внутри
.babelrc
файл.