Tổng quan về thời gian chạy V8

Trong Apps Script và JavaScript, môi trường thời gian chạy hoặc môi trường thời gian chạy chứa công cụ JavaScript có chức năng phân tích cú pháp và thực thi mã tập lệnh. Môi trường thời gian chạy cung cấp các quy tắc về cách truy cập bộ nhớ, cách chương trình có thể tương tác với hệ điều hành của máy tính, cũng như cú pháp chương trình nào là hợp pháp. Mỗi trình duyệt web có một môi trường thời gian chạy dành cho JavaScript.

Trước đây, Apps Script được trình dịch JavaScript Rhino của Mozilla cung cấp. Mặc dù Rhino cung cấp một cách thuận tiện để Apps Script thực thi các tập lệnh của nhà phát triển, nhưng Rhino cũng liên kết Apps Script với một phiên bản JavaScript cụ thể (ES5). Nhà phát triển Apps Script không thể sử dụng các tính năng và cú pháp JavaScript hiện đại hơn trong các tập lệnh bằng thời gian chạy Rhino.

Để giải quyết mối lo ngại này, Apps Script hiện đã được môi trường thời gian chạy V8 hỗ trợ Chrome và Node.js hỗ trợ. Bạn có thể di chuyển các tập lệnh hiện có sang V8 để tận dụng cú pháp và các tính năng JavaScript hiện đại.

Trang này mô tả các tính năng mới mà V8 bật và cách bạn có thể bật V8 để sử dụng trong tập lệnh. Di chuyển tập lệnh sang V8 mô tả các bước di chuyển tập lệnh hiện có để sử dụng thời gian chạy V8.

Các tính năng của thời gian chạy V8

Tập lệnh sử dụng thời gian chạy V8 có thể tận dụng các tính năng sau:

Cú pháp ECMAScript hiện đại

Bạn có thể sử dụng cú pháp ECMAScript hiện đại trong các tập lệnh được thời gian chạy V8 hỗ trợ. Cú pháp này bao gồm let, const và nhiều tính năng phổ biến khác.

Xem ví dụ về cú pháp V8 để nắm được danh sách ngắn các điểm cải tiến phổ biến về cú pháp mà bạn có thể thực hiện bằng thời gian chạy V8.

Cải thiện khả năng phát hiện hàm

Tính năng phát hiện hàm Apps Script được cải thiện cho các tập lệnh sử dụng V8. Môi trường thời gian chạy mới nhận dạng các định dạng định nghĩa hàm sau:

      function normalFunction() {}
      async function asyncFunction() {}
      function* generatorFunction() {}

      var varFunction = function() {}
      let letFunction = function() {}
      const constFunction = function() {}

      var namedVarFunction = function alternateNameVarFunction() {}
      let namedLetFunction = function alternateNameLetFunction() {}
      const namedConstFunction = function alternateNameConstFunction() {}

      var varAsyncFunction = async function() {}
      let letAsyncFunction = async function() {}
      const constAsyncFunction = async function() {}

      var namedVarAsyncFunction = async function alternateNameVarAsyncFunction() {}
      let namedLetAsyncFunction = async function alternateNameLetAsyncFunction() {}
      const namedConstAsyncFunction = async function alternateNameConstAsyncFunction() {}

      var varGeneratorFunction = function*() {}
      let letGeneratorFunction = function*() {}
      const constGeneratorFunction = function*() {}

      var namedVarGeneratorFunction = function* alternateNameVarGeneratorFunction() {}
      let namedLetGeneratorFunction = function* alternateNameLetGeneratorFunction() {}
      const namedConstGeneratorFunction = function* alternateNameConstGeneratorFunction() {}

      var varLambda = () => {}
      let letLambda = () => {}
      const constLambda = () => {}

      var varAsyncLambda = async () => {}
      let letAsyncLambda = async () => {}
      const constAsyncLambda = async () => {}

Gọi phương thức đối tượng từ các điều kiện kích hoạt và lệnh gọi lại

Những tập lệnh sử dụng V8 có thể gọi các phương thức đối tượng và phân lớp các phương thức tĩnh từ những vị trí mà bạn đã có thể gọi các phương thức thư viện. Các địa điểm này bao gồm:

Ví dụ về V8 sau đây cho thấy việc sử dụng các phương thức đối tượng khi tạo mục trong trình đơn trong Google Trang tính:

function onOpen() {
  var ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
  ui.createMenu('Custom Menu')
      .addItem('First item', 'menu.item1')
      .addSeparator()
      .addSubMenu(ui.createMenu('Sub-menu')
          .addItem('Second item', 'menu.item2'))
      .addToUi();
}

var menu = {
  item1: function() {
    SpreadsheetApp.getUi().alert('You clicked: First item');
  },
  item2: function() {
    SpreadsheetApp.getUi().alert('You clicked: Second item');
  }
}

Xem nhật ký

Apps Script cung cấp 2 dịch vụ ghi nhật ký: dịch vụ Logger và lớp console. Cả hai dịch vụ này đều ghi nhật ký vào cùng một dịch vụ Ghi nhật ký Stackdriver.

Để hiển thị nhật ký Loggerconsole, ở đầu trình chỉnh sửa tập lệnh, hãy nhấp vào Nhật ký thực thi.

Xem các lần thực thi

Để xem nhật ký thực thi của tập lệnh, hãy mở dự án Apps Script và nhấp vào biểu tượng Các lần thực thi ở bên trái.

Ví dụ về cú pháp V8

Sau đây là danh sách ngắn các tính năng cú pháp phổ biến có sẵn cho các tập lệnh sử dụng thời gian chạy V8.

letconst

Từ khoá letconst cho phép bạn xác định các biến cục bộ phạm vi khối và hằng số phạm vi khối tương ứng.

// V8 runtime
let s = "hello";
if (s === "hello") {
  let s = "world";
  console.log(s);  // Prints "world"
}
console.log(s);  // Prints "hello"

const N = 100;
N = 5; // Results in TypeError
      

Các hàm mũi tên

Hàm mũi tên mang lại một cách ngắn gọn để xác định các hàm trong biểu thức.

// Rhino runtime
function square(x) {
  return x * x;
}

console.log(square(5));  // Outputs 25
      
// V8 runtime
const square = x => x * x;
console.log(square(5));  // Outputs 25

// Outputs [1, 4, 9]
console.log([1, 2, 3].map(x => x * x));
      

Lớp

Lớp cung cấp một phương thức để sắp xếp mã có tính kế thừa về mặt lý thuyết. Các lớp trong V8 chủ yếu là đường cú pháp thay vì tính kế thừa dựa trên nguyên mẫu JavaScript.

// V8 runtime
class Rectangle {
  constructor(width, height) { // class constructor
    this.width = width;
    this.height = height;
  }

  logToConsole() { // class method
    console.log(`Rectangle(width=${this.width}, height=${this.height})`);
  }
}

const r = new Rectangle(10, 20);
r.logToConsole();  // Outputs Rectangle(width=10, height=20)
      

Huỷ cấu trúc thao tác chỉ định

Biểu thức huỷ cấu trúc gán là một cách nhanh chóng để giải nén giá trị từ các mảng và đối tượng thành các biến riêng biệt.

// Rhino runtime
var data = {a: 12, b: false, c: 'blue'};
var a = data.a;
var c = data.c;
console.log(a, c);  // Outputs 12 "blue"

var array = [1, 2, 3];
var x = a[0];
var y = a[1];
var z = a[2];
console.log(x, y, z);  // Outputs 1 2 3
      
// V8 runtime
var data = {a: 12, b: false, c: 'blue'};
var {a, c} = data;
console.log(a, c);  // Outputs 12 "blue"


var array = [1, 2, 3];
var [x, y, z] = array;
console.log(x, y, z);  // Outputs 1 2 3


      

Giá trị cố định của mẫu

Hằng mẫu là giá trị cố định kiểu chuỗi cho phép các biểu thức được nhúng. Giúp bạn tránh được các câu lệnh nối chuỗi phức tạp hơn.

// Rhino runtime
var name =
  'Hi ' + first + ' ' + last + '.';
var url =
  'http://localhost:3000/api/messages/'
  + id;
      
// V8 runtime
var name = `Hi ${first} ${last}.`;
var url =
  `http://localhost:3000/api/messages/${id}`;


      

Tham số mặc định

Tham số mặc định cho phép bạn chỉ định giá trị mặc định cho các tham số hàm trong phần khai báo hàm. Việc này có thể giúp đơn giản hoá mã trong phần nội dung hàm vì bạn không cần phải chỉ định rõ ràng các giá trị mặc định cho các tham số còn thiếu.

// Rhino runtime
function hello(greeting, name) {
    greeting = greeting || "hello";
    name = name || "world";
    console.log(
        greeting + " " + name + "!");
}

hello();  // Outputs "hello world!"
      
// V8 runtime
var hello =
  function(greeting="hello", name="world") {
      console.log(
        greeting + " " + name + "!");
  }

hello();  // Outputs "hello world!"

      

Chuỗi nhiều dòng

Bạn có thể xác định chuỗi nhiều dòng bằng cú pháp giống như giá trị cố định của mẫu. Tương tự như với giá trị cố định của mẫu, cú pháp này cho phép bạn tránh việc nối chuỗi và đơn giản hoá định nghĩa chuỗi.

// Rhino runtime
var multiline = "This string is sort of\n"
+ "like a multi-line string,\n"
+ "but it's not really one.";
      
// V8 runtime
var multiline = `This on the other hand,
actually is a multi-line string,
thanks to JavaScript ES6`;
      

Bật môi trường thời gian chạy V8

Nếu một tập lệnh đang sử dụng thời gian chạy Rhino, thì bạn có thể chuyển tập lệnh đó sang V8 bằng cách làm như sau:

  1. Mở dự án Apps Script.
  2. Ở bên trái, hãy nhấp vào biểu tượng Cài đặt dự án .
  3. Chọn hộp đánh dấu Bật thời gian chạy Chrome V8.

Ngoài ra, bạn có thể trực tiếp chỉ định thời gian chạy của tập lệnh bằng cách chỉnh sửa tệp kê khai tập lệnh:

  1. Mở dự án Apps Script.
  2. Ở bên trái, hãy nhấp vào biểu tượng Cài đặt dự án .
  3. Chọn hộp đánh dấu Hiển thị tệp kê khai "appsscript.json" trong trình chỉnh sửa.
  4. Ở bên trái, hãy nhấp vào biểu tượng Trình chỉnh sửa > appsscript.json.
  5. Trong tệp kê khai appsscript.json, hãy đặt trường runtimeVersion thành giá trị V8.
  6. Ở trên cùng, hãy nhấp vào biểu tượng Lưu dự án .

Bài viết Di chuyển tập lệnh sang V8 giải thích các bước khác mà bạn nên thực hiện để đảm bảo tập lệnh hoạt động tốt khi sử dụng V8.

Bật thời gian chạy Rhino

Nếu tập lệnh của bạn đang sử dụng V8 và bạn cần chuyển sang V8 để sử dụng môi trường thời gian chạy Rhino ban đầu, hãy làm như sau:

  1. Mở dự án Apps Script.
  2. Ở bên trái, hãy nhấp vào biểu tượng Cài đặt dự án .
  3. Bỏ chọn hộp kiểm Bật thời gian chạy Chrome V8.

Ngoài ra, hãy chỉnh sửa tệp kê khai tập lệnh của bạn:

  1. Mở dự án Apps Script.
  2. Ở bên trái, hãy nhấp vào biểu tượng Cài đặt dự án .
  3. Chọn hộp đánh dấu Hiển thị tệp kê khai "appsscript.json" trong trình chỉnh sửa.
  4. Ở bên trái, hãy nhấp vào biểu tượng Trình chỉnh sửa > appsscript.json.
  5. Trong tệp kê khai appsscript.json, hãy đặt trường runtimeVersion thành giá trị DEPRECATED_ES5.
  6. Ở trên cùng, hãy nhấp vào biểu tượng Lưu dự án .

Làm cách nào để di chuyển các tập lệnh hiện có?

Hướng dẫn Di chuyển tập lệnh sang V8 mô tả các bước bạn cần thực hiện để di chuyển tập lệnh hiện có nhằm sử dụng V8. Việc này bao gồm việc bật môi trường thời gian chạy V8 và kiểm tra tập lệnh xem có bất kỳ trường hợp không tương thích đã biết nào không.

Tự động di chuyển tập lệnh sang phiên bản 8

Kể từ ngày 18 tháng 2 năm 2020, Google sẽ bắt đầu di chuyển dần các tập lệnh hiện có vượt qua quy trình kiểm thử khả năng tương thích tự động sang phiên bản V8. Các tập lệnh bị ảnh hưởng sẽ tiếp tục hoạt động bình thường sau khi được di chuyển.

Nếu bạn muốn chọn không di chuyển tự động một tập lệnh, hãy đặt trường runtimeVersion trong tệp kê khai thành DEPRECATED_ES5. Bạn có thể chọn di chuyển tập lệnh sang V8 theo cách thủ công bất cứ lúc nào sau đó.

Làm cách nào để báo cáo lỗi?

Hướng dẫn hỗ trợ giải thích cách nhận trợ giúp lập trình trên Stack Overflow, tìm kiếm báo cáo vấn đề hiện có, gửi lỗi mới và đưa ra yêu cầu về tính năng mới.