Transpile Async Await propuesta con Babel.js?
Existe una propuesta para introducir el estilo C# async-await
. Conozco a Babel.js transpila ES6 a ES5, pero ¿hay alguna manera de hacerlo transpilar async-await a ES5
?
5 answers
Babel v6
A partir de Babel v6, Babel ya no contiene ningún transformer. Debe especificar explícitamente cualquier característica que desee transformar.
Presets-entorno no ES2015
La forma más rápida de hacer que esto funcione es usar presets que ya contienen el conjunto de complementos necesarios para transformar ES2015 y propuestas más recientes. Para async
, tendrá la es2015
y es2017
ajustes preestablecidos y la runtime
plugin (no olvides instalar babel-runtime
como se describe en la documentación):
{
"presets": [
"es2015",
"es2017"
],
"plugins": [
"transform-runtime"
]
}
Presets-entorno ES2015
Si ejecuta el código en un entorno que admite ES2015 (más específicamente, generadores y Promesas), todo lo que necesita es el preset de es2017:
{
"presets": [
"es2017"
]
}
Custom
Para transformar solo las funciones async
, necesitará los siguientes complementos.
syntax-async-functions
es necesario en todos los casos para poder analizar async funciones
Para que ejecute la función async, debe usar
-
transform-async-to-generator
: Convierte la funciónasync
en un generador. Esto utilizará la propia implementación de "co-rutina" de Babel. -
transform-async-to-module-method
: También convierte la funciónasync
en un generador, pero la pasa al módulo y método especificado en la configuración en lugar del método propio de Babel. Esto le permite utilizar bibliotecas externas comobluebird
.
Si su código se ejecuta en un entorno que admite generadores, entonces no queda nada por hacer. Sin embargo, si el entorno de destino no admite generadores , también tendrá que transformar el generador. Esto se hace a través de la transform-regenerator
transformar. Esta transformación depende de las funciones de tiempo de ejecución, por lo que también necesitará las de Babel transform-runtime
transform (+el paquete babel-runtime
).
Ejemplos:
Asíncrono a generator
{
"plugins": [
"syntax-async-functions",
"transform-async-to-generator"
]
}
Método asincrónico al módulo
{
"plugins": [
"syntax-async-functions",
["transform-async-to-module-method", {
"module": "bluebird",
"method": "coroutine"
}]
]
}
Asíncrono a generador + regenerador
{
"plugins": [
"syntax-async-functions",
"transform-async-to-generator",
"transform-regenerator",
"transform-runtime"
]
}
Babel v4 y anteriores
Sí, tienes que activar los transformadores experimentales. Babel utilizaregenerador .
Uso
$ babel --experimental
babel.transform("code", { experimental: true });
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-09 16:32:48
Esta solución puede haber cambiado desde (Feb 25 Felix Kling) o tal vez todavía hay más de una forma de usar async await.
Lo que funcionó para nosotros fue ejecutar Babel así
$ npm install babel-runtime
$ babel inputES7.js -o outputES5.js --optional runtime
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-30 17:17:21
Conseguí que esto funcionara a partir de hoy haciendo un npm install babel-preset-stage-0
adicional y usándolo como
var babel = require("babel-core");
var transpiled = babel.transform(code, { "presets": ["stage-0"] });
Véase
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-08 12:51:18
Quizás aún más actualizado ahora; simplemente ponga las cosas de babel en un archivo separado:
'use strict';
require('babel/register'); // Imports babel - auto transpiles the other stuff
require('./app'); // this is es6 - gets transpiled
Vea mi código en how-can-i-use-es2016-es7-async-await-in-my-acceptance-tests-for-a-koa-js-app para más detalles.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-28 01:57:48
La respuesta aprobada parece estar desactualizada ahora. La bandera experimental ha sido obsoleta a favor de stage.
Http://babeljs.io/blog/2015/03/31/5.0.0/#experimental-option
Uso
$ babel --stage 0
babel.transform("code", { stage: 0 });
Etapa 0
- es7.Classpropiedades
- es7.comprensiones
Etapa 1
- es7.asyncFunctions
- es7.decoradores
- es7.exportExtensions
- es7.objectRestSpread
Etapa 2 (La etapa 2 y superior están habilitadas de forma predeterminada)
- es7.Operador de exponenciación
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-06 14:15:04