Я пытаюсь использовать 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 работает просто отлично. Есть идеи, что я делаю не так?
javascript
node.js
babeljs
BrunoLM
источник
источник
Ответы:
babel-polyfill
( устарело с версии 7.4). Вы также должны установить его, чтобы заставить работать async / await.package.json
.babelrc
.js с async / await (пример кода)
В файле запуска
Если вы используете веб-пакет, вы должны поместить его в качестве первого значения вашего
entry
массива в файле конфигурации вашего веб-пакета (обычноwebpack.config.js
), как указано в комментарии @Cemen:Если вы хотите запустить тесты с babel, используйте:
источник
require("babel-polyfill")
которых не работают, вы добавляете"babel-polyfill"
в вашемentry
в конфигурации, как это:entry: ["babel-polyfill", "src/main.js"]
. Это сработало для меня, в том числе использование в Webpack-Dev-Server с HMR.devDependency
если вы используете webpack, потому что он будет «компилировать» файлы перед запуском.dependency
если вы не используете веб-пакет и вам требуется Babel.Помимо polyfill, я использую babel-plugin-transform-runtime . Плагин описывается как:
Он также включает поддержку async / await и других встроенных функций ES 6.
В
.babelrc
, добавить плагин времени выполненияисточник
babel-runtime
чтобы получить асинхронную работу ждать. Это верно? Изменить: я работаю на стороне сервера кода. :)babel-plugin-transform-runtime
требуется только Работает как шарм.require
вызовов, добавляемыхtransform-runtime
плагином, требуется дополнительное задание Browserify или Webpack .npm install --save-dev @babel/plugin-transform-runtime
Babel 7 пользователей
У меня были некоторые проблемы с этим, так как большая часть информации была для предыдущих версий Babel. Для Babel 7 установите эти две зависимости:
И в .babelrc добавьте:
источник
"plugins": ["@babel/plugin-transform-runtime"]
, а не"plugins": [ ["@babel/transform-runtime"] ]
здесь. Другое название плагина. Обе работы. Но какой из них правильный? ..@babel/transform-runtime
к плагинам вызвало у меня ошибку «экспорт не определен». Я изменил это на это, чтобы заставить работать асинхронно в Babel7:["@babel/plugin-transform-runtime", { "regenerator": true } ]
Обновить
Это работает, если вы установите цель в Chrome. Но это может не работать для других целей, пожалуйста, обратитесь к: https://github.com/babel/babel-preset-env/issues/112
Так что этот ответ НЕ совсем подходит для исходного вопроса. Я буду держать это здесь как ссылку на
babel-preset-env
.Простое решение - добавить
import 'babel-polyfill'
в начале вашего кода.Если вы используете веб-пакет, быстрое решение - добавить,
babel-polyfill
как показано ниже:Я полагаю, что нашел последнюю лучшую практику.
Проверьте этот проект: https://github.com/babel/babel-preset-env
Используйте следующую конфигурацию вашего babel:
Тогда ваше приложение должно хорошо работать в последних 2 версиях браузера Chrome.
Вы также можете установить Node в качестве цели или настроить список браузеров в соответствии с https://github.com/ai/browserslist.
Скажи мне что, не говори мне как.
Мне действительно нравится
babel-preset-env
философия: скажи мне, какую среду ты хочешь поддерживать, НЕ говори мне, как их поддерживать. Это красота декларативного программирования.Я проверил,
async
await
и они работают. Я не знаю, как они работают, и я действительно не хочу знать. Вместо этого я хочу тратить свое время на собственный код и свою бизнес-логику. Благодаряbabel-preset-env
, это освобождает меня от адской конфигурации Вавилона.источник
babel-preset-env
но я думаю, что это того стоит. Люблю декларативный стиль тоже. Такжеyarn install
сейчасyarn add
В качестве альтернативы, если вам не нужны все модули
babel-polyfill
, вы можете просто указатьbabel-regenerator-runtime
в конфигурации вашего веб-пакета:При использовании webpack-dev-server с HMR это значительно уменьшило количество файлов, которые приходится компилировать в каждой сборке. Этот модуль устанавливается как часть,
babel-polyfill
так что если у вас уже есть все в порядке, в противном случае вы можете установить его отдельно сnpm i -D babel-regenerator-runtime
.источник
Мое простое решение:
.babelrc
источник
loose: true
необходимо?Вавилон 7.4.0 или новее (core-js 2/3)
По Вавилонской 7.4.0 ,
@babel/polyfill
является устаревшим .В общем, существует два способа установки полифилов / регенераторов: через глобальное пространство имен (вариант 1) или как ponyfill (вариант 2, без глобального загрязнения).
Опция 1:
@babel/preset-env
будет автоматически использовать
regenerator-runtime
и вcore-js
соответствии с вашей целью . Не нужно ничего импортировать вручную. Не забудьте установить зависимости времени выполнения:Или установите
useBuiltIns: "entry"
и импортируйте его вручную:Вариант 2:
@babel/transform-runtime
с@babel/runtime
(без глобального загрязнения области)Установите это:
Если вы используете полифилы core-js, вы устанавливаете
@babel/runtime-corejs2
или@babel/runtime-corejs3
вместо этого смотрите здесь .ура
источник
babel-regenerator-runtime
теперь устарела , вместо этого следует использоватьregenerator-runtime
.Чтобы использовать генератор времени выполнения с
webpack
иbabel
v7:установить
regenerator-runtime
:А затем добавьте в конфигурацию веб-пакета:
источник
@babel/preset-env
«сuseBuiltIns
с динамически подставлять выполнения на основе ваших целевых браузеров.Обновите свой
.babelrc
файл в соответствии со следующими примерами, он будет работать.Если вы используете
@babel/preset-env
пакетисточник
targets
кажется, относится к этому :, вthe environments you support/target for your project
то времяtargets.node
как это :if you want to compile against the current node version, you can specify "node": true or "node": "current", which would be the same as "node": process.versions.node
"stage-0"
в процессе), и ошибка регенератора ушла.Будьте осторожны с подъемными функциями
У меня был и «импорт полифилла», и моя «асинхронная функция» в одном и том же файле, однако я использовал синтаксис функции, который поднимает ее над полифиллом, что дает мне
ReferenceError: regeneratorRuntime is not defined
ошибку.Изменить этот код
к этому
чтобы он не поднимался над импортом полифилл.
источник
По состоянию на октябрь 2019 года это работало для меня:
Добавьте это в пресет.
Затем установите регенератор, используя npm.
А затем в вашем основном файле использовать: (этот импорт используется только один раз)
Это позволит вам использовать
async
awaits
в вашем файле и удалитьregenerator error
источник
useBuiltIns
умолчанию оно равноfalse
. Это не будет автоматически импортировать любые заливки в зависимости от целевого окружения, что подрывает цель"@babel/preset-env"
. Вот также связанный комментарий одного из разработчиков babel.Если использовать,
babel-preset-stage-2
то просто нужно запустить скрипт с--require babel-polyfill
.В моем случае эта ошибка была выброшена
Mocha
тестами.После исправлена проблема
mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill
источник
Эта ошибка возникает, когда
async/await
функции используются без соответствующих плагинов Babel. Начиная с марта 2020 года, все, что вам нужно сделать, должно быть следующим. (@babel/polyfill
и многие из принятых решений устарели в Вавилоне. Подробнее в Вавилонской документации. )В командной строке введите:
В вашем
babel.config.js
файле добавьте этот плагин@babel/plugin-transform-runtime
. Примечание: приведенный ниже пример включает в себя другие пресеты и плагины, которые у меня есть для небольшого проекта React / Node / Express, над которым я недавно работал:источник
.babelrc
выглядит так: `` `{" presets ": [" @ babel / preset-env "]," plugins ": [" @ babel / plugin-transform-runtime "]}` ``Я начал получать эту ошибку после преобразования моего проекта в проект машинописного текста. Из того, что я понимаю, проблема заключается в том, что async / await не распознается.
Для меня ошибка была исправлена добавлением двух параметров в мою настройку:
Как уже упоминалось выше, мне нужно было добавить babel-polyfill в мой массив записей webpack:
Мне нужно было обновить мой .babelrc, чтобы разрешить компиляцию async / await в генераторы:
DevDependencies:
Мне также пришлось установить несколько вещей в мои devDependencies в моем файле package.json. А именно, мне не хватало babel-plugin-transform-async-to-generator, babel-polyfill и babel-preset-es2015:
Полный код Gist:
Я получил код от действительно полезной и лаконичной информации GitHub, которую вы можете найти здесь .
источник
env
вместоes2015
.env
включаетes2015
уже.У меня была эта проблема в Chrome. Как и в ответе RienNeVaPlu, это решило это для меня:
Тогда в моем коде:
Рад избежать лишних 200 кБ от
babel-polyfill
.источник
Вы получаете ошибку, потому что асинхронные / ожидающие используют генераторы, которые являются функцией ES2016, а не ES2015. Одним из способов решения этой проблемы является установка предустановки babel для ES2016 (
npm install --save babel-preset-es2016
) и компиляция в ES2016 вместо ES2015:Как уже упоминалось в других ответах, вы также можете использовать полифилы (хотя убедитесь, что вы загружаете полифилл в первую очередь до запуска любого другого кода). В качестве альтернативы, если вы не хотите включать все зависимости polyfill, вы можете использовать babel-регенератор-время выполнения или babel-plugin-transform-runtime .
источник
Я исправил эту ошибку, установив babel-polyfill
затем я импортировал его в точку входа моего приложения
для тестирования я включил --require babel-polyfill в свой тестовый скрипт
источник
Новый ответ Почему вы следуете моему ответу?
Ответ : Потому что я собираюсь дать вам ответ с последней версией обновления проекта npm.
04/14/2017
Если вы используете эту версию или более UP версию Npm и все другие ... ТАК просто нужно изменить:
webpack.config.js
После изменения
webpack.config.js
файлов Просто добавьте эту строку в начало вашего кода.Теперь проверьте, все ли в порядке. Ссылка ССЫЛКА
Также спасибо @BrunoLM за его хороший ответ.
источник
Целевые браузеры, которые мне нужно поддерживать, уже поддерживают async / await, но при написании тестов mocha без правильной настройки я все еще получал эту ошибку.
Большинство статей я гугл устарели, в то числе принятого ответ и высокий голосовали ответы здесь, то есть вам не нужен
polyfill
,babel-regenerator-runtime
,babel-plugin-transform-runtime
. и т.д., если ваш целевой браузер (ы) уже поддерживает async / await (конечно, если вам не нужен polyfill)Я не хочу использовать
webpack
.Ответ Тайлера Лонга на самом деле правильный, поскольку он предложил
babel-preset-env
(но я сначала его опустил, поскольку он упомянул полифилл в начале).ReferenceError: regeneratorRuntime is not defined
Сначала я все еще получил, потом понял, что это потому, что я не поставил цель. После установки цели для узла я исправляю ошибку регенератора:источник
Для пользователей babel7 и ParcelJS> = 1.10.0 пользователей
.babelrc
взято с https://github.com/parcel-bundler/parcel/issues/1762
источник
1 - Установить метод babel-plugin-transform-async-to-module, babel-polyfil, bluebird, babel-preset-es2015, babel-core:
2 - Добавьте в свой js babel polyfill:
import 'babel-polyfill';
3 - Добавьте плагин в ваш .babelrc:
Источник: http://babeljs.io/docs/plugins/transform-async-to-module-method/
источник
У меня была установка
с использованием веб-пакета
presets: ['es2015', 'stage-0']
и мокко , который работает тесты , составленные WebPack.
Чтобы все мои
async/await
тесты работали, мне нужно было только добавитьmocha --require babel-polyfill
опцию.источник
Я получаю эту ошибку, используя gulp with rollup, когда я пытался использовать генераторы ES6:
Я могу на всякий случай
babel-polyfill
решить проблему, включив в качестве компонента беседки:и добавьте его в качестве зависимости в index.html:
источник
Для людей, желающих использовать
babel-polyfill
версию 7 ^, сделайте это сwebpack
вер3 ^.Npm установить модуль
npm i -D @babel/polyfill
Затем в вашем
webpack
файле в вашейentry
точке сделать этоисточник
Мой рабочий шаблон Babel 7 для реакции с временем работы регенератора:
.babelrc
package.json
main.js
источник
Если вы создаете приложение, вам просто нужны
@babel/preset-env
и@babel/polyfill
:(Примечание: вам не нужно устанавливать
core-js
иregenerator-runtime
пакеты , потому что они оба были установлены @ столпотворение / polyfill)Тогда в
.babelrc
:Теперь установите ваши целевые среды. Здесь мы делаем это в
.browserslistrc
файле:Наконец, если вы пошли с
useBuiltIns: "entry"
, поместитеimport @babel/polyfill
в верхней части вашего файла записи. В противном случае, вы сделали.Использование этого метода будет выборочно импортировать эти полифилы и файл 'регенератор-время выполнения' (исправляя вашу
regeneratorRuntime is not defined
проблему здесь), ТОЛЬКО если они нужны любой из ваших целевых сред / браузеров.источник
для дальнейшего использования :
Начиная с версии 7.0.0-beta.55 Babel были удалены предустановки
см блог https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets
асинхронное ожидание все еще может быть использовано
https://babeljs.io/docs/en/babel-plugin-transform-async-to-generator#usage
установка
использование в .babelrc
и использование babel polyfill https://babeljs.io/docs/en/babel-polyfill
установка
webpack.config.js
источник
В 2019
Babel 7.4.0+
годуbabel-polyfill
пакет был объявлен устаревшим в пользу непосредственного включенияcore-js/stable
(core-js@3+
для полифильма функций ECMAScript) иregenerator-runtime/runtime
(необходимого для использования переданных функций генератора):Информация из
babel-polyfill
документации .источник
Самый простой способ исправить эту проблему «регенератор не определен» в вашей консоли:
Вам не нужно устанавливать ненужные плагины. Просто добавь:
<script src="https://unpkg.com/regenerator-runtime@0.13.1/runtime.js"></script>
внутри тела в вашем index.html. Теперь регенератор должен быть определен после запуска babel, и теперь ваши асинхронные / ожидающие функции должны быть успешно скомпилированы в ES2015.
источник
Если вы используете Gulp + Babel для внешнего интерфейса, вам нужно использовать babel-polyfill
npm install babel-polyfill
а затем добавьте тег script в index.html над всеми другими тегами сценария и укажите ссылку на babel-polyfill из node_modules
источник