BabelJS - Plugins Babel
BabelJS é um compilador javascript que altera a sintaxe do código fornecido com base em predefinições e plug-ins disponíveis. O fluxo da compilação do babel envolve as seguintes 3 partes -
- parsing
- transforming
- printing
O código dado ao babel é devolvido como está, apenas com a sintaxe alterada. Já vimos predefinições sendo adicionadas ao arquivo .babelrc para compilar o código de es6 para es5 ou vice-versa. Os presets nada mais são do que um conjunto de plug-ins. O Babel não mudará nada se os detalhes dos presets ou plug-ins não forem fornecidos durante a compilação.
Vamos agora discutir os seguintes plug-ins -
- transform-class-properties
- Transform-exponentiation-operator
- For-of
- descanse objeto e espalhe
- async/await
Agora, vamos criar uma configuração de projeto e trabalhar em alguns plugins, o que dará uma compreensão clara dos requisitos dos plugins no babel.
comando
npm initTemos que instalar os pacotes necessários para o babel - babel cli, babel core, babel-preset, etc.
Pacotes para babel 6
npm install babel-cli babel-core babel-preset-es2015 --save-devPacotes para babel 7
npm install @babel/cli @babel/core @babel/preset-env --save-devCrie um arquivo js em seu projeto e escreva seu código js.
Classes - Transform-class-properties
Observe os códigos fornecidos abaixo para este propósito -
Exemplo
main.js
class Person {
   constructor(fname, lname, age, address) {
      this.fname = fname;
      this.lname = lname;
      this.age = age;
      this.address = address;
   }
   get fullname() {
      return this.fname + "-" + this.lname;
   }
}
var a = new Person("Siya", "Kapoor", "15", "Mumbai");
var persondet = a.fullname;No momento, não demos nenhum detalhe de preset ou plugin para o babel. Se acontecer de transpilarmos o código usando o comando -
npx babel main.js --out-file main_out.jsmain_out.js
class Person {
   constructor(fname, lname, age, address) {
      this.fname = fname;
      this.lname = lname;
      this.age = age;
      this.address = address;
   }
   get fullname() {
      return this.fname + "-" + this.lname;
   }
}
var a = new Person("Siya", "Kapoor", "15", "Mumbai");
var persondet = a.fullname;Obteremos o código como está. Vamos agora adicionar predefinições a.babelrc Arquivo.
Note - Criar .babelrc arquivo dentro da pasta raiz do seu projeto.
.babelrc for babel 6
 
                .babelrc for babel 7
{
   "presets":["@babel/env"]
}Já instalamos os presets; agora vamos executar o comando novamente -
npx babel main.js --out-file main_out.jsmain_out.js
"use strict";
var _createClass = function () {
   function defineProperties(target, props) {
      for (var i = 0; i < props.length; i++) {
         var descriptor = props[i];
         descriptor.enumerable = descriptor.enumerable || false; 
         descriptor.configurable = true; 
         if ("value" in descriptor) descriptor.writable = true; 
         Object.defineProperty(target, descriptor.key, descriptor); 
      }
   }
   return function (Constructor, protoProps, staticProps) { 
      if (protoProps) defineProperties(Constructor.prototype, protoProps); 
      if (staticProps) defineProperties(Constructor, staticProps); 
      return Constructor; 
   }; 
}();
function _classCallCheck(instance, Constructor) { 
   if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function"); 
   } 
}
var Person = function () {
   function Person(fname, lname, age, address) {
      _classCallCheck(this, Person);
      this.fname = fname;
      this.lname = lname;
      this.age = age;
      this.address = address;
   }
   _createClass(Person, [{
      key: "fullname",
      get: function get() {
         return this.fname + "-" + this.lname;
      }
   }]);
   return Person;
}();
var a = new Person("Siya", "Kapoor", "15", "Mumbai");
var persondet = a.fullname;No ES6, a sintaxe da classe é a seguinte
class Person {
   constructor(fname, lname, age, address) {
      this.fname = fname;
      this.lname = lname;
      this.age = age;
      this.address = address;
   }
   get fullname() {
      return this.fname + "-" + this.lname;
   }
}Existe um construtor e todas as propriedades da classe são definidas dentro dele. No caso, precisamos definir propriedades de classe fora da classe, não podemos fazer isso.
Exemplo
class Person {
   name = "Siya Kapoor";
   fullname = () => {
      return this.name;
   }
}
var a = new Person();
var persondet = a.fullname();
console.log("%c"+persondet, "font-size:25px;color:red;");Se por acaso compilarmos o código acima, ocorrerá um erro no babel. Isso faz com que o código não seja compilado.
 
                Para fazer isso funcionar da maneira que queremos, podemos fazer uso do plugin babel chamado babel-plugin-transform-class-properties. Para fazer funcionar, precisamos instalá-lo primeiro da seguinte maneira -
Pacotes para babel 6
npm install --save-dev babel-plugin-transform-class-propertiesPacote para babel 7
npm install --save-dev @babel/plugin-proposal-class-propertiesAdd the plugin to .babelrc file for babel 6 -
 
                .babelrc for babel 7
{
   "plugins": ["@babel/plugin-proposal-class-properties"]
}Agora, vamos executar o comando novamente.
comando
npx babel main.js --out-file main_out.jsmain.js
class Person {
   name = "Siya Kapoor";
   fullname = () => {
      return this.name;
   }
}
var a = new Person();
var persondet = a.fullname();
console.log("%c"+persondet, "font-size:25px;color:red;");Compiled to main_out.js
class Person {
   constructor() {
      this.name = "Siya Kapoor";
      this.fullname = () => {
         return this.name;
      };
   }
}
var a = new Person();
var persondet = a.fullname();
console.log("%c"+persondet, "font-size:25px;color:red;");Output
A seguir está a saída que obtemos quando usados em um navegador -
 
                Operador de exponenciação - operador de exponenciação de transformação
** é o operador usado para exponenciação em ES7. O exemplo a seguir mostra o funcionamento do mesmo no ES7. Ele também mostra como transpilar código usando babeljs.
Exemplo
let sqr = 9 ** 2;
console.log("%c"+sqr, "font-size:25px;color:red;");Para transpilar o operador de exponenciação, precisamos que um plugin seja instalado da seguinte maneira -
Packages for babel 6
npm install --save-dev babel-plugin-transform-exponentiation-operatorPackages for babel 7
npm install --save-dev @babel/plugin-transform-exponentiation-operatorAdicione os detalhes do plugin para .babelrc arquivo da seguinte forma para babel 6 -
{
   "plugins": ["transform-exponentiation-operator"]
}.babelrc for babel 7
{
   "plugins": ["@babel/plugin-transform-exponentiation-operator"]
}command
npx babel exponeniation.js --out-file exponeniation_out.jsexponeniation_out.js
let sqr = Math.pow(9, 2);
console.log("%c" + sqr, "font-size:25px;color:red;");Output
 
                Para de
Os pacotes necessários para os plug-ins em babel6 e 7 são os seguintes -
Babel6
npm install --save-dev babel-plugin-transform-es2015-for-ofBabel 7
npm install --save-dev @babel/plugin-transform-for-of.babelrc for babel6
{
   "plugins": ["transform-es2015-for-of"]
}.babelrc for babel7
{
   "plugins": ["@babel/plugin-transform-for-of"]
}forof.js
let foo = ["PHP", "C++", "Mysql", "JAVA"];
for (var i of foo) {
   console.log(i);
}comando
npx babel forof.js --out-file forof_es5.jsForof_es5.js
let foo = ["PHP", "C++", "Mysql", "JAVA"];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
   for (var _iterator = foo[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
      var i = _step.value;
      console.log(i);
   }
} catch (err) {
   _didIteratorError = true;
   _iteratorError = err;
} finally {
   try {
      if (!_iteratorNormalCompletion && _iterator.return) {
         _iterator.return();
      }
   } finally {
      if (_didIteratorError) {
         throw _iteratorError;
      }
   }
}Output
 
                objeto resto espalhado
Os pacotes necessários para os plug-ins em babel6 e 7 são os seguintes -
Babel 6
npm install --save-dev babel-plugin-transform-object-rest-spreadBabel 7
npm install --save-dev @babel/plugin-proposal-object-rest-spread.babelrc for babel6
{
   "plugins": ["transform-object-rest-spread"]
}.babelrc for babel7
{
   "plugins": ["@babel/plugin-proposal-object-rest-spread"]
}o.js
let { x1, y1, ...z1 } = { x1: 11, y1: 12, a: 23, b: 24 };
console.log(x1);
console.log(y1);
console.log(z1);
let n = { x1, y1, ...z1};
console.log(n);comando
npx babel o.js --out-file o_es5.jso_es5.js
var _extends = Object.assign || function (target) {
   for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i]; for (var key in source) {
         if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key]; 
         } 
      } 
   } 
   return target; 
};
function _objectWithoutProperties(obj, keys) {
   var target = {};
   for (var i in obj) {
      if (keys.indexOf(i) >= 0) continue;
      if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
      target[i] = obj[i];
   }
   return target;
}
let _x1$y1$a$b = { x1: 11, y1: 12, a: 23, b: 24 },
   { x1, y1 } = _x1$y1$a$b,
   z1 = _objectWithoutProperties(_x1$y1$a$b, ["x1", "y1"]);
console.log(x1);
console.log(y1);
console.log(z1);
let n = _extends({ x1, y1 }, z1);
console.log(n);Output
 
                assíncrono / aguardar
Precisamos que os seguintes pacotes sejam instalados para o babel 6 -
npm install --save-dev babel-plugin-transform-async-to-generatorPacotes para babel 7
npm install --save-dev @babel/plugin-transform-async-to-generator.babelrc for babel 6
{
   "plugins": ["transform-async-to-generator"]
}.babelrc for babel 7
{
   "plugins": ["@babel/plugin-transform-async-to-generator"]
}async.js
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();comando
npx babel async.js --out-file async_es5.jsasync_es5.js
function _asyncToGenerator(fn) {
   return function () {
      var gen = fn.apply(this, arguments);
      return new Promise(function (resolve, reject) {
         function step(key, arg) {
            try {
               var info = gen[key](arg);
               var value = info.value; 
            } catch (error) {
               reject(error);
               return; 
            } if (info.done) {
               resolve(value); 
            } else {
               return Promise.resolve(value).then(function (value) {
                  step("next", value);
               },
               function (err) {
                  step("throw", err); }); 
            }
         } return step("next"); 
      });
   };
}
let timer = () => {
   return new Promise(resolve => {
      setTimeout(() => {
         resolve("Promise resolved after 5 seconds");
      }, 5000);
   });
};
let out = (() => {
   var _ref = _asyncToGenerator(function* () {
      let msg = yield timer();
      console.log(msg);
      console.log("hello after await");
   });
   return function out() {
      return _ref.apply(this, arguments);
   };
})();
out();Temos que fazer uso de polyfill para o mesmo, pois não funcionará em navegadores onde as promessas não são suportadas.
Output
