BabelJS - Transpile ES7 tính năng cho ES5

Trong chương này, chúng ta sẽ học cách chuyển các tính năng của ES7 sang ES5.

ECMA Script 7 có thêm các tính năng mới sau:

  • Async-Await
  • Toán tử lũy thừa
  • Array.prototype.includes()

Chúng tôi sẽ biên dịch chúng sang ES5 bằng cách sử dụng babeljs. Tùy thuộc vào yêu cầu dự án của bạn, cũng có thể biên dịch mã trong bất kỳ phiên bản ecma nào, chẳng hạn như ES7 sang ES6 hoặc ES7 sang ES5. Vì phiên bản ES5 là phiên bản ổn định nhất và hoạt động tốt trên tất cả các trình duyệt hiện đại và cũ, chúng tôi sẽ biên dịch mã thành ES5.

Async-Await

Async là một hàm không đồng bộ, trả về một lời hứa ngầm định. Lời hứa hoặc được giải quyết hoặc bị từ chối. Hàm async giống như một hàm tiêu chuẩn thông thường. Hàm có thể có biểu thức chờ đợi tạm dừng việc thực thi cho đến khi nó trả về một lời hứa và khi nó nhận được nó, việc thực thi sẽ tiếp tục. Await sẽ chỉ hoạt động nếu hàm không đồng bộ.

Đây là một ví dụ làm việc về async và await.

Thí dụ

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

Đầu ra

Promise resolved after 5 seconds
hello after await

Biểu thức await được thêm vào trước khi hàm hẹn giờ được gọi. Chức năng hẹn giờ sẽ trả lại lời hứa sau 5 giây. Vì vậy, await sẽ tạm dừng quá trình thực thi cho đến khi giải quyết hoặc từ chối chức năng hẹn giờ hứa hẹn và sau đó tiếp tục.

Bây giờ chúng ta hãy chuyển mã trên sang ES5 bằng cách sử dụng 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();

chỉ huy

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 không biên dịch đối tượng hoặc phương thức; vì vậy ở đây các lời hứa được sử dụng sẽ không được chuyển đổi và sẽ được hiển thị như nó vốn có. Để hỗ trợ các hứa hẹn trên các trình duyệt cũ, chúng ta cần thêm mã, mã này sẽ có hỗ trợ cho các lời hứa. Bây giờ, chúng ta hãy cài đặt babel-polyfill như sau:

npm install --save babel-polyfill

Nó nên được lưu dưới dạng phụ thuộc và không phụ thuộc vào nhà phát triển.

Để chạy mã trong trình duyệt, chúng tôi sẽ sử dụng tệp polyfill từ node_modules \ babel-polyfill \ dist \ polyfill.min.js và gọi nó bằng thẻ script như hình dưới đây -

<!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>

Khi chạy trang kiểm tra trên, bạn sẽ thấy đầu ra trong bảng điều khiển như hình dưới đây

Toán tử lũy thừa

** là toán tử được sử dụng để tính lũy thừa trong ES7. Ví dụ sau đây cho thấy hoạt động tương tự trong ES7 và mã được chuyển đổi bằng cách sử dụng babeljs.

Thí dụ

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

Đầu ra

81

ES6 - Luỹ thừa

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

Để xử lý toán tử lũy thừa, chúng ta cần cài đặt một plugin sẽ được cài đặt như sau:

chỉ huy

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

Thêm chi tiết plugin vào .babelrc tập tin như sau -

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

chỉ huy

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

Tính năng này cho giá trị true nếu phần tử được truyền đến nó có trong mảng và false nếu ngược lại.

Thí dụ

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

Đầu ra

true
true
false

Chúng ta phải sử dụng lại babel-polyfill ở đây như includeslà một phương thức trên một mảng và nó sẽ không được chuyển. Chúng tôi cần thêm một bước để bao gồm polyfill để làm cho nó hoạt động trong các trình duyệt cũ hơn.

ES6 - array.includes

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

chỉ huy

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

Để kiểm tra nó trong trình duyệt cũ hơn, chúng ta cần sử dụng polyfill như hình dưới đây -

<!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>

Đầu ra