BabelJS - Transpile las características de ES7 a ES5

En este capítulo, aprenderemos cómo transpilar las características de ES7 a ES5.

ECMA Script 7 tiene las siguientes características nuevas agregadas:

  • Async-Await
  • Operador de exponenciación
  • Array.prototype.includes()

Los compilaremos en ES5 usando babeljs. Dependiendo de los requisitos de su proyecto, también es posible compilar el código en cualquier versión de ecma, es decir, ES7 a ES6 o ES7 a ES5. Dado que la versión ES5 es la más estable y funciona bien en todos los navegadores modernos y antiguos, compilaremos el código en ES5.

Async-Await

Async es una función asincrónica que devuelve una promesa implícita. La promesa se resuelve o se rechaza. La función asíncrona es la misma que una función estándar normal. La función puede tener una expresión de espera que pausa la ejecución hasta que devuelve una promesa y, una vez que la obtiene, la ejecución continúa. Await solo funcionará si la función es asíncrona.

Aquí hay un ejemplo práctico sobre async y await.

Ejemplo

let timer = () => {
   return new Promise(resolve => {
      setTimeout(() => {
         resolve("Promise resolved after 5 seconds");
      }, 5000);
   });
};
let out = async () => {
   let msg = await timer();
   console.log(msg);
   console.log("hello after await");
};
out();

Salida

Promise resolved after 5 seconds
hello after await

La expresión de espera se agrega antes de que se llame a la función de temporizador. La función de temporizador devolverá la promesa después de 5 segundos. Así que await detendrá la ejecución hasta que se resuelva o rechace la promesa de la función del temporizador y luego continuará.

Transpilemos ahora el código anterior a ES5 usando babel.

ES7 - Async-Await

let timer = () => {
   return new Promise(resolve => {
      setTimeout(() => {
         resolve("Promise resolved after 5 seconds");
      }, 5000);
   });
};
let out = async () => {
   let msg = await timer();
   console.log(msg);
   console.log("hello after await");
};
out();

mando

npx babel asyncawait.js --out-file asyncawait_es5.js

BabelJS - ES5

"use strict";

var timer = function timer() {
   return new Promise(function (resolve) {
      setTimeout(function () {
         resolve("Promise resolved after 5 seconds");
      }, 5000);
   });
};
var out = async function out() {
   var msg = await timer();
   console.log(msg);
   console.log("hello after await");
};

out();

Babeljs no compila objetos ni métodos; por lo que aquí las promesas utilizadas no se transpilarán y se mostrarán como están. Para admitir promesas en navegadores antiguos, necesitamos agregar código, que tendrá soporte para promesas. Por ahora, instalemos babel-polyfill de la siguiente manera:

npm install --save babel-polyfill

Debe guardarse como una dependencia y no como una dependencia de desarrollo.

Para ejecutar el código en el navegador, usaremos el archivo polyfill de node_modules \ babel-polyfill \ dist \ polyfill.min.js y lo llamaremos usando la etiqueta de script como se muestra a continuación:

<!DOCTYPE html>
<html>
   <head>
      <title>BabelJs Testing</title>
   </head>
   <body>
      <script src="node_modules\babel-polyfill\dist\polyfill.min.js" type="text/javascript"></script>
      <script type="text/javascript" src="aynscawait_es5.js"></script>
   </body>
</html>

Cuando ejecute la página de prueba anterior, verá la salida en la consola como se muestra a continuación

Operador de exponenciación

** es el operador utilizado para exponenciación en ES7. El siguiente ejemplo muestra el funcionamiento del mismo en ES7 y el código se transpila usando babeljs.

Ejemplo

let sqr = 9 ** 2;
console.log(sqr);

Salida

81

ES6 - Exponenciación

let sqr = 9 ** 2;
console.log(sqr);

Para transpilar el operador de exponenciación, necesitamos instalar un complemento que se instalará de la siguiente manera:

mando

npm install --save-dev babel-plugin-transform-exponentiation-operator

Agregue los detalles del complemento a .babelrc archivo de la siguiente manera:

{
   "presets":[
      "es2015"
   ],
   "plugins": ["transform-exponentiation-operator"]
}

mando

npx babel exponeniation.js --out-file exponeniation_es5.js

BabelJS - ES5

"use strict";

var sqr = Math.pow(9, 2);
console.log(sqr);

Array.prototype.includes ()

Esta característica da verdadero si el elemento que se le pasa está presente en la matriz y falso en caso contrario.

Ejemplo

let arr1 = [10, 6, 3, 9, 17];
console.log(arr1.includes(9));
let names = ['Siya', 'Tom', 'Jerry', 'Bean', 'Ben'];
console.log(names.includes('Tom'));
console.log(names.includes('Be'));

Salida

true
true
false

Tenemos que usar babel-polyfill nuevamente aquí como includeses un método en una matriz y no se transpilará. Necesitamos un paso adicional para incluir polyfill para que funcione en navegadores más antiguos.

ES6 - array.incluye

let arr1 = [10, 6, 3, 9, 17];
console.log(arr1.includes(9));
let names = ['Siya', 'Tom', 'Jerry', 'Bean', 'Ben'];
console.log(names.includes('Tom'));
console.log(names.includes('Be'));

mando

npx babel array_include.js --out-file array_include_es5.js

Babel-ES5

'use strict';

var arr1 = [10, 6, 3, 9, 17];
console.log(arr1.includes(9));
var names = ['Siya', 'Tom', 'Jerry', 'Bean', 'Ben'];
console.log(names.includes('Tom'));
console.log(names.includes('Be'));

Para probarlo en un navegador más antiguo, necesitamos usar polyfill como se muestra a continuación:

<!DOCTYPE html>
<html>
   <head>
      <title>BabelJs Testing</title>
   </head>
   <body>
      <script src="node_modules\babel-polyfill\dist\polyfill.min.js" type="text/javascript"></script>
      <script type="text/javascript" src="array_include_es5.js"></script>
   </body>
</html>

Salida