BabelJS - Plugin Babel

BabelJS adalah kompilator javascript yang mengubah sintaks kode yang diberikan berdasarkan preset dan plugin yang tersedia. Alur penyusunan babel melibatkan 3 bagian berikut -

  • parsing
  • transforming
  • printing

Kode yang diberikan ke babel diberikan kembali apa adanya hanya dengan sintaks yang diubah. Kita telah melihat preset ditambahkan ke file .babelrc untuk mengkompilasi kode dari es6 ke es5 atau sebaliknya. Preset tidak lain adalah seperangkat plugin. Babel tidak akan mengubah apapun jika detail preset atau plugin tidak diberikan selama kompilasi.

Sekarang mari kita bahas plugin berikut -

  • transform-class-properties
  • Transform-exponentiation-operator
  • For-of
  • objek istirahat dan menyebar
  • async/await

Sekarang, kita akan membuat pengaturan proyek dan mengerjakan beberapa plugin, yang akan memberikan pemahaman yang jelas tentang persyaratan plugin di babel.

perintah

npm init

Kita harus menginstal paket yang diperlukan untuk babel - babel cli, babel core, babel-preset, dll.

Paket untuk babel 6

npm install babel-cli babel-core babel-preset-es2015 --save-dev

Paket untuk babel 7

npm install @babel/cli @babel/core @babel/preset-env --save-dev

Buat file js di proyek Anda dan tulis kode js Anda.

Kelas - Transformasi-properti-kelas

Perhatikan kode yang diberikan di bawah ini untuk tujuan ini -

Contoh

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;

Saat ini, kami belum memberikan detail preset atau plugin apa pun ke babel. Jika kita kebetulan mentranspilasi kode menggunakan perintah -

npx babel main.js --out-file main_out.js

main_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;

Kami akan mendapatkan kode apa adanya. Sekarang mari kita tambahkan preset ke.babelrc mengajukan.

Note - Buat .babelrc file di dalam folder root proyek Anda.

.babelrc for babel 6

.babelrc for babel 7

{
   "presets":["@babel/env"]
}

Kami telah menginstal preset; sekarang mari kita jalankan perintah lagi -

npx babel main.js --out-file main_out.js

main_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;

Di ES6, sintaks kelas adalah sebagai berikut

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;
   }
}

Ada konstruktor dan semua properti kelas didefinisikan di dalamnya. Kalau begitu, kita perlu mendefinisikan properti kelas di luar kelas yang tidak dapat kita lakukan.

Contoh

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;");

Jika kita kebetulan mengkompilasi kode di atas, itu akan menimbulkan kesalahan pada babel. Hal ini menyebabkan kode tidak dapat dikompilasi.

Untuk membuat ini bekerja sesuai keinginan kita, kita dapat menggunakan plugin babel yang disebut babel-plugin-transform-class-properties. Untuk membuatnya berfungsi, kita perlu menginstalnya terlebih dahulu sebagai berikut -

Paket untuk babel 6

npm install --save-dev babel-plugin-transform-class-properties

Paket untuk babel 7

npm install --save-dev @babel/plugin-proposal-class-properties

Add the plugin to .babelrc file for babel 6 -

.babelrc for babel 7

{
   "plugins": ["@babel/plugin-proposal-class-properties"]
}

Sekarang, kita akan menjalankan perintahnya lagi.

perintah

npx babel main.js --out-file main_out.js

main.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

Berikut adalah keluaran yang kita dapatkan saat digunakan di browser -

Operator Eksponensial - transform-exponentiation-operator

** adalah operator yang digunakan untuk eksponen di ES7. Contoh berikut menunjukkan cara kerja yang sama di ES7. Ini juga menunjukkan bagaimana mentranspilasi kode menggunakan babeljs.

Contoh

let sqr = 9 ** 2;
console.log("%c"+sqr, "font-size:25px;color:red;");

Untuk mentranspilasi operator eksponen, kita membutuhkan plugin untuk diinstal sebagai berikut -

Packages for babel 6

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

Packages for babel 7

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

Tambahkan detail plugin ke .babelrc file sebagai berikut untuk 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.js

exponeniation_out.js

let sqr = Math.pow(9, 2);
console.log("%c" + sqr, "font-size:25px;color:red;");

Output

Untuk-dari

Paket yang dibutuhkan untuk plugin di babel6 dan 7 adalah sebagai berikut -

Babel6

npm install --save-dev babel-plugin-transform-es2015-for-of

Babel 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);
}

perintah

npx babel forof.js --out-file forof_es5.js

Forof_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

objek istirahat menyebar

Paket yang dibutuhkan untuk plugin di babel6 dan 7 adalah sebagai berikut -

Babel 6

npm install --save-dev babel-plugin-transform-object-rest-spread

Babel 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);

perintah

npx babel o.js --out-file o_es5.js

o_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

async / await

Kami membutuhkan paket berikut untuk diinstal untuk babel 6 -

npm install --save-dev babel-plugin-transform-async-to-generator

Paket untuk 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();

perintah

npx babel async.js --out-file async_es5.js

async_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();

Kita harus menggunakan polyfill karena hal itu tidak akan berfungsi di browser yang tidak mendukung promise.

Output