tldr tldr - 3 months ago 26
Javascript Question

Transpile Async Await proposal with Babel.js?

There is a proposal for introducing C# style

async-await
. I know Babel.js transpiles ES6 to ES5, but is there any way to make it transpile async-await to
ES5
?

Answer

Babel v6

As of Babel v6, Babel doesn't contain any transformers itself anymore. You have to explicitly specify any feature you want to transform.

Presets

The quickest way to get this working is to use presets which already contain the set of plugins needed to transform ES2015 and newer proposals. For async, you will need the es2015 and stage-3 preset and the runtime plugin.

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

Custom

To only transform the async functions, you will need the following plugins.

syntax-async-functions is needed in any every case to be able to parse async functions

In order to run the async function, you either need to use

  • transform-async-to-generator: Converts the async function into a generator. This will use Babel's own "co-routine" implementation.
  • transform-async-to-module-method: Also converts the async function to a generator, but passes it to the module and method specified in the configuration instead of Babel's own method. This allows you to use external libraries such as bluebird.

If your code runs in an environment that supports generators, then there is nothing left to do. However, if the target environment does not support generators, you will also have to transform the generator. This is done via the transform-regenerator transform. This transform depends on runtime functions, so you will also need Babel's transform-runtime transform.

Examples:

Async to generator

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

Async to module method

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

Async to generator + regenerator

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

Babel v4 and older

Yes, you have to enable the experimental transformers. Babel uses regenerator.

Usage

$ babel --experimental

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