Przegląd środowiska wykonawczego V8

W Apps Script i JavaScript środowisko wykonawcze lub środowisko wykonawcze zawiera mechanizm JavaScript, który analizuje i wykonuje kod skryptu. Środowisko wykonawcze udostępnia reguły dostępu do pamięci, sposobów interakcji programu z systemem operacyjnym komputera oraz legalnej składni. Każda przeglądarka ma swoje środowisko wykonawcze dla JavaScriptu.

W przeszłości skrypt Apps Script był obsługiwany przez algorytm Rhino JavaScript firmy Mozilla. Rhino pozwalał na wygodne wykonywanie skryptów programistycznych Google Apps Script, jednak powiązał też skrypt Apps Script z określoną wersją JavaScriptu (ES5). Deweloperzy Apps Script nie mogą używać bardziej nowoczesnej składni ani funkcji JavaScriptu w skryptach wykorzystujących środowisko wykonawcze Rhino.

Aby rozwiązać ten problem, aplikacja Apps Script jest teraz obsługiwana przez środowisko wykonawcze V8, które obsługuje Chrome i Node.js. Aby skorzystać z nowoczesnej składni i funkcji JavaScriptu, możesz przenieść istniejące skrypty do wersji 8.

Na tej stronie opisujemy nowe funkcje dostępne w wersji 8 i wyjaśniamy, jak włączyć wersję 8 w swoich skryptach. Migracja skryptów do wersji 8 zawiera opis czynności, które trzeba wykonać, aby przenieść istniejące skrypty do środowiska wykonawczego V8.

Funkcje środowiska wykonawczego V8

Skrypty używające środowiska wykonawczego V8 mogą korzystać z następujących funkcji:

Nowoczesna składnia ECMAScript

W skryptach obsługiwanych przez środowisko wykonawcze V8 możesz używać nowoczesnej składni ECMAScript. Ta składnia obejmuje let, const i wiele innych popularnych funkcji.

Zapoznaj się z przykładami składni V8, aby poznać krótką listę popularnych ulepszeń składni, które można wprowadzić za pomocą środowiska wykonawczego V8.

Ulepszone wykrywanie funkcji

Wykrywanie funkcji Apps Script jest udoskonalone w przypadku skryptów korzystających z wersji 8. Nowe środowisko wykonawcze rozpoznaje te formaty definicji funkcji:

      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 () => {}

Wywołuj metody obiektów z aktywatorów i wywołań zwrotnych

Skrypty korzystające z wersji 8 mogą wywoływać metody obiektów i metody statyczne klas z miejsc, w których można było już wywoływać metody biblioteki. Są to między innymi:

Poniższy przykład w wersji 8 ilustruje użycie metod obiektów podczas tworzenia elementów menu w Arkuszach Google:

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

Wyświetlanie logów

Apps Script udostępnia 2 usługi logowania: Logger i klasę console. Obie usługi zapisują logi w tej samej usłudze Stackdriver Logging.

Aby wyświetlić logi Logger i console, u góry edytora skryptów kliknij Dziennik wykonywania.

Wyświetl wykonania

Aby wyświetlić historię wykonywania skryptu, otwórz projekt Apps Script i po lewej stronie kliknij wykonania .

Przykłady składni V8

Poniżej znajduje się krótka lista popularnych funkcji składniowych dostępnych dla skryptów korzystających ze środowiska wykonawczego V8.

letconst

Słowa kluczowe let i const pozwalają definiować odpowiednio zmienne lokalne z zakresu bloku i stałe zakresu blokowania.

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

Funkcje strzałek

Funkcje strzałek umożliwiają kompaktowe definiowanie funkcji w wyrażeniach.

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

Zajęcia

Klasy zapewniają środki do koncepcyjnego porządkowania kodu z dziedziczeniem. Klasy w V8 to głównie cukier składniowy, a nie dziedziczenie oparte na prototypie JavaScriptu.

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

Niszczenie projektów

Zniszczenie struktury wyrażeń to szybki sposób na wyodrębnianie wartości z tablic i obiektów na różne zmienne.

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


      

Litery szablonów

Litery szablonów to literały tekstowe umożliwiające umieszczanie wyrażeń. Pozwalają uniknąć bardziej złożonych instrukcji łączenia ciągów znaków.

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


      

Parametry domyślne

Parametry domyślne pozwalają określić wartości domyślne parametrów funkcji w deklaracji funkcji. Może to uprościć kod w treści funkcji, ponieważ eliminuje konieczność jawnego przypisywania wartości domyślnych do brakujących parametrów.

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

      

Ciągi wielowierszowe

Ciągi wielowierszowe możesz definiować za pomocą tej samej składni co litery szablonów. Podobnie jak w przypadku literałów szablonów ta składnia pozwala uniknąć konkatenacji ciągów znaków i uprościć definicje ciągów znaków.

// 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`;
      

Włączanie środowiska wykonawczego V8

Jeśli skrypt korzysta ze środowiska wykonawczego Rhino, możesz go przełączyć na wersję V8, wykonując te czynności:

  1. Otwórz projekt Apps Script.
  2. Po lewej stronie kliknij Ustawienia projektu .
  3. Zaznacz pole wyboru Włącz środowisko wykonawcze Chrome 8.

Możesz też określić środowisko wykonawcze skryptu bezpośrednio, edytując plik manifestu:

  1. Otwórz projekt Apps Script.
  2. Po lewej stronie kliknij Ustawienia projektu .
  3. Zaznacz pole wyboru Pokazuj plik manifestu „appsscript.json” w edytorze.
  4. Po lewej stronie kliknij Edytor > appsscript.json.
  5. W pliku manifestu appsscript.json ustaw w polu runtimeVersion wartość V8.
  6. U góry kliknij Zapisz projekt .

W artykule Migracja skryptów do wersji V8 opisano inne czynności, które należy wykonać, aby zapewnić prawidłowe działanie skryptów w wersji V8.

Włączanie środowiska wykonawczego Rhino

Jeśli Twój skrypt korzysta z wersji V8 i chcesz go przełączyć na oryginalne środowisko wykonawcze Rhino, wykonaj te czynności:

  1. Otwórz projekt Apps Script.
  2. Po lewej stronie kliknij Ustawienia projektu .
  3. Odznacz pole wyboru Włącz środowisko wykonawcze Chrome 8.

Możesz też edytować plik manifestu skryptu:

  1. Otwórz projekt Apps Script.
  2. Po lewej stronie kliknij Ustawienia projektu .
  3. Zaznacz pole wyboru Pokazuj plik manifestu „appsscript.json” w edytorze.
  4. Po lewej stronie kliknij Edytor > appsscript.json.
  5. W pliku manifestu appsscript.json ustaw w polu runtimeVersion wartość DEPRECATED_ES5.
  6. U góry kliknij Zapisz projekt .

Jak przenieść istniejące skrypty?

Przewodnik Migracja skryptów do wersji V8 zawiera opis czynności, które należy wykonać, aby przenieść istniejący skrypt do wersji V8. Wiąże się to z włączeniem środowiska wykonawczego V8 i sprawdzeniem skryptu pod kątem znanych niezgodności.

Automatyczna migracja skryptów do wersji V8

Od 18 lutego 2020 r. Google zacznie stopniowo przenosić do wersji 8 istniejące skrypty, które przejdą nasz automatyczny test zgodności. Po migracji skrypty, których dotyczy ten problem, będą nadal działać normalnie.

Jeśli chcesz zrezygnować z automatycznej migracji skryptu, ustaw pole runtimeVersion w pliku manifestu na DEPRECATED_ES5. W każdej chwili możesz ręcznie przenieść skrypt do wersji V8.

Jak zgłaszać błędy?

Przewodnik pomocy wyjaśnia, jak uzyskać pomoc w programowaniu na Stack Overflow, przeszukiwać dotychczasowe raporty o problemach, zgłaszać nowe błędy i zgłaszać nowe prośby o dodanie funkcji.