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

Transpile Async Ожидание предложения с Babel.js?

Существует предложение о введении стиля С# async-await. Я знаю, что Babel.js переводит ES6 в ES5, но есть ли способ сделать его переадресацией async-wait до ES5?

4b9b3361

Ответ 1

Babel v6

Что касается Babel v6, то Babel больше не содержит трансформаторов. Вы должны явно указать любую функцию, которую вы хотите преобразовать.

Предустановки - среда без ES2015

Самый быстрый способ получить эту работу - использовать пресеты, которые уже содержат набор плагинов, необходимых для преобразования ES2015 и новых предложений. Для async вам понадобятся предварительные es2015 и es2017 и плагин runtime (не забудьте установить время babel-runtime как описано в документации):

{
  "presets": [
    "es2015",
    "es2017"
  ],
  "plugins": [
    "transform-runtime"
  ]
}

Предустановки - среда ES2015

Если вы запускаете код в среде, поддерживающей ES2015 (более конкретно, генераторы и обещания), тогда вам нужно только установить es2017:

{
  "presets": [
    "es2017"
  ]
}

изготовленный на заказ

Чтобы преобразовать только функции async, вам понадобятся следующие плагины.

syntax-async-functions необходимы в любом случае для возможности синтаксического анализа асинхронных функций

Чтобы запустить функцию async, вам нужно либо использовать

  • transform-async-to-generator: Преобразует async функцию в генератор. Это будет использовать "совместную" реализацию Babel.
  • transform-async-to-module-method: также преобразует функцию async в генератор, но передает его модулю и методу, указанным в конфигурации вместо собственного метода Babel. Это позволяет использовать внешние библиотеки, такие как bluebird.

Если ваш код работает в среде, поддерживающей генераторы, то ничего не остается. Однако, если целевая среда не поддерживает генераторы, вам также придется преобразовать генератор. Это делается с помощью transform-regenerator. Это преобразование зависит от функций времени выполнения, поэтому вам также понадобится transform-runtime Babel (+ пакет babel-runtime).

Примеры:

Асинхронный генератор

{
  "plugins": [
    "syntax-async-functions",
    "transform-async-to-generator"
  ]
}

Асинхронный метод

{
  "plugins": [
    "syntax-async-functions",
   ["transform-async-to-module-method", {
     "module": "bluebird",
     "method": "coroutine"
   }]
  ]
}

Асинхронный генератор + регенератор

{
  "plugins": [
    "syntax-async-functions",
    "transform-async-to-generator",
    "transform-regenerator",
    "transform-runtime"
  ]
}

Babel v4 и старше

Да, вы должны включить экспериментальные трансформаторы. Вавилон использует регенератор.

Применение

$ babel --experimental

babel.transform("code", { experimental: true });

Ответ 2

Это решение, возможно, изменилось с тех пор (25 февраля Felix Kling) или, возможно, существует еще один способ использования async.

Что сработало для нас, так это запустить Babel так

$ npm install babel-runtime

$ babel inputES7.js -o outputES5.js --optional runtime

Ответ 4

Возможно, еще более современное; просто поместите материал Babel в отдельный файл:

'use strict';

require('babel/register'); // Imports babel - auto transpiles the other stuff
require('./app'); // this is es6 - gets transpiled

Подробнее см. мой код how-can-i-use-es2016-es7-async-await-in-my-acceptance-tests-for-a-koa-js-app.

Ответ 5

Утвержденный ответ кажется устаревшим. Экспериментальный флаг устарел в пользу этапа.

http://babeljs.io/blog/2015/03/31/5.0.0/#experimental-option

Использование

$ babel --stage 0

babel.transform("code", { stage: 0 });

Этап 0

  • es7.classProperties
  • es7.comprehensions

Этап 1

  • es7.asyncFunctions
  • es7.decorators
  • es7.exportExtensions
  • es7.objectRestSpread

Этап 2 (этап 2 и выше включены по умолчанию)

  • es7.exponentiationOperator