Обзор среды выполнения V8

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

В Apps Script и JavaScript среда выполнения или среда выполнения содержит механизм JavaScript, который анализирует и выполняет код сценария. Среда выполнения предоставляет правила доступа к памяти, взаимодействия программы с операционной системой компьютера и допустимого синтаксиса программы. Каждый веб-браузер имеет среду выполнения для JavaScript.

Исторически сложилось так, что Apps Script работал на основе интерпретатора JavaScript Rhino от Mozilla. Хотя Rhino предоставил Apps Script удобный способ выполнения сценариев разработчика, он также привязал Apps Script к конкретной версии JavaScript ( ES5 ). Разработчики сценариев приложений не могут использовать более современный синтаксис и функции JavaScript в сценариях, использующих среду выполнения Rhino.

Чтобы решить эту проблему, Apps Script теперь поддерживается средой выполнения V8 , на которой работают Chrome и Node.js. Вы можете перенести существующие скрипты в V8 , чтобы воспользоваться преимуществами современного синтаксиса и функций JavaScript.

На этой странице описываются новые функции, включенные в V8, и то, как вы можете включить V8 для использования в своих скриптах. Миграция сценариев в V8 описывает шаги по миграции существующих сценариев для использования среды выполнения V8.

Особенности среды выполнения V8

Сценарии, использующие среду выполнения V8, могут воспользоваться следующими функциями:

Современный синтаксис ECMAScript

Вы можете использовать современный синтаксис ECMAScript в сценариях, работающих на среде выполнения V8. Этот синтаксис включает в себя let , const и многие другие популярные функции.

См. примеры синтаксиса V8 для краткого списка популярных улучшений синтаксиса, которые вы можете сделать с помощью среды выполнения V8.

Улучшенное обнаружение функций

Обнаружение функции скрипта приложений улучшено для скриптов, использующих V8. Новая среда выполнения распознает следующие форматы определения функций:

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

Вызов методов объекта из триггеров и обратных вызовов

Сценарии, использующие V8, могут вызывать методы объекта и статические методы класса из тех мест, где вы уже могли вызывать библиотечные методы. К таким местам относятся следующие:

В следующем примере V8 показано использование методов объекта при создании пунктов меню в 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');
  }
}

Просмотр журналов

Apps Script предоставляет две службы ведения журналов: службу Logger и класс console . Обе эти службы записывают журналы в одну и ту же службу ведения журналов Stackdriver .

Чтобы отобразить журналы Logger и console , в верхней части редактора скриптов щелкните Execution log .

Посмотреть казни

Чтобы просмотреть историю выполнения вашего скрипта, откройте проект Apps Script и слева щелкните Executions .

Примеры синтаксиса V8

Ниже приведен краткий список популярных синтаксических функций, доступных для сценариев, использующих среду выполнения V8.

let и const

Ключевые слова let и const позволяют вам определять локальные переменные области блока и константы области блока соответственно.

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

Стрелочные функции

Стрелочные функции обеспечивают компактный способ определения функций в выражениях.

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

Классы

Классы предоставляют средства для концептуальной организации кода с наследованием. Классы в V8 — это прежде всего синтаксический сахар по сравнению с наследованием на основе прототипов 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)
      

Деструктуризация заданий

Деструктурирующие выражения присваивания — это быстрый способ распаковать значения из массивов и объектов в отдельные переменные.

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


      

Литералы шаблонов

Литералы шаблонов — это строковые литералы, допускающие встраивание выражений. Они позволяют избежать более сложных операторов конкатенации строк.

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


      

Параметры по умолчанию

Параметры по умолчанию позволяют указать значения по умолчанию для параметров функции в объявлении функции. Это может упростить код в теле функции, поскольку устраняет необходимость явно назначать значения по умолчанию отсутствующим параметрам.

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

      

Многострочные строки

Вы можете определить многострочные строки, используя тот же синтаксис, что и литералы шаблонов . Как и в случае литералов шаблонов, этот синтаксис позволяет избежать конкатенации строк и упростить определения строк.

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

Включение среды выполнения V8

Если скрипт использует среду выполнения Rhino, вы можете переключить его на V8, выполнив следующие действия:

  1. Откройте проект скрипта приложений.
  2. Слева нажмите проекта .
  3. Установите флажок Включить среду выполнения Chrome V8 .

В качестве альтернативы вы можете указать время выполнения скрипта напрямую, отредактировав файл манифеста скрипта:

  1. Откройте проект скрипта приложений.
  2. Слева нажмите проекта .
  3. Установите флажок Показать файл манифеста «appsscript.json» в редакторе .
  4. Слева нажмите редактора > appsscript.json .
  5. В файле манифеста appsscript.json задайте для поля runtimeVersion значение V8 .
  6. Вверху нажмите Сохранить проект .

В разделе «Миграция скриптов в V8» объясняются другие шаги, которые вы должны предпринять, чтобы убедиться, что ваш скрипт хорошо работает с V8.

Включение среды выполнения Rhino

Если ваш скрипт использует V8 и вам нужно переключить его на использование оригинальной среды выполнения Rhino, сделайте следующее:

  1. Откройте проект скрипта приложений.
  2. Слева нажмите проекта .
  3. Снимите флажок Включить среду выполнения Chrome V8 .

В качестве альтернативы отредактируйте манифест скрипта:

  1. Откройте проект скрипта приложений.
  2. Слева нажмите проекта .
  3. Установите флажок Показать файл манифеста «appsscript.json» в редакторе .
  4. Слева нажмите редактора > appsscript.json .
  5. В файле манифеста appsscript.json задайте для поля runtimeVersion значение DEPRECATED_ES5 .
  6. Вверху нажмите Сохранить проект .

Как перенести существующие скрипты?

В руководстве по переносу сценариев на V8 описаны шаги, которые необходимо предпринять для переноса существующего сценария на использование V8. Это включает в себя включение среды выполнения V8 и проверку сценария на наличие известных несовместимостей.

Автоматическая миграция скриптов на V8

С 18 февраля 2020 года Google начнет постепенный перенос существующих скриптов, прошедших автоматический тест на совместимость, в версию 8. Затронутые скрипты продолжают нормально работать после миграции.

Если вы хотите отключить автоматическую миграцию сценария, установите для поля runtimeVersion в его манифесте значение DEPRECATED_ES5 . После этого вы можете вручную перенести сценарий в V8 в любое время.

Как сообщить об ошибках?

В руководстве по поддержке объясняется, как получить помощь по программированию в Stack Overflow, найти существующие отчеты о проблемах, зарегистрировать новые ошибки и отправить запросы на новые функции.