Panoramica del runtime V8

In Apps Script e JavaScript, un runtime o un ambiente di runtime contiene il motore JavaScript che analizza ed esegue il codice dello script. Il runtime fornisce le regole per l'accesso alla memoria, per la modalità di interazione del programma con il sistema operativo del computer e per la sintassi del programma consentita. Ogni browser web ha un ambiente di runtime per JavaScript.

In passato, Apps Script è stato basato sull'interprete JavaScript Rhino di Mozilla. Sebbene Rhino fornisse un modo pratico per consentire ad Apps Script di eseguire gli script degli sviluppatori, legava anche Apps Script a una versione specifica di JavaScript (ES5). Gli sviluppatori di Apps Script non possono utilizzare la sintassi e le funzionalità JavaScript più moderne negli script che utilizzano il runtime Rhino.

Per risolvere il problema, ora Apps Script è supportato dal runtime V8 che alimenta Chrome e Node.js. Puoi eseguire la migrazione degli script esistenti a V8 per sfruttare le funzionalità e la sintassi JavaScript moderne.

Questa pagina descrive le nuove funzionalità abilitate da V8 e come attivare V8 per l'utilizzo negli script. Eseguire la migrazione degli script a V8 descrive i passaggi per eseguire la migrazione degli script esistenti in modo che utilizzino il runtime V8.

Funzionalità del runtime V8

Gli script che utilizzano il runtime V8 possono sfruttare le seguenti funzionalità:

Sintassi ECMAScript moderna

Puoi utilizzare la sintassi ECMAScript moderna negli script basati sul runtime V8. Questa sintassi include let, const e molte altre funzionalità popolari.

Consulta Esempi di sintassi V8 per un breve elenco di miglioramenti sintattici comuni che puoi apportare utilizzando il runtime V8.

Rilevamento delle funzioni migliorato

Il rilevamento delle funzioni di Apps Script è migliorato per gli script che utilizzano V8. Il nuovo runtime riconosce i seguenti formati di definizione di funzione:

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

Chiama i metodi dell'oggetto da trigger e callback

Gli script che utilizzano V8 possono chiamare metodi di oggetti e metodi statici di classi da punti in cui potresti già chiamare i metodi della libreria. Questi luoghi includono:

Il seguente esempio V8 mostra l'utilizzo dei metodi dell'oggetto durante la creazione di voci di menu in Fogli 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');
  }
}

Visualizza i log

Apps Script fornisce due servizi di logging: il servizio Logger e la classe console. Entrambi questi servizi scrivono i log nello stesso servizio Stackdriver Logging.

Per visualizzare i log Logger e console, fai clic su Log esecuzione nella parte superiore dell'editor di script.

Visualizza esecuzioni

Per visualizzare la cronologia di esecuzione dello script, apri il progetto Apps Script e fai clic su Esecuzioni a sinistra.

Esempi di sintassi V8

Di seguito è riportato un breve elenco di funzionalità sintattiche comuni disponibili per gli script che utilizzano il runtime V8.

let e const

Le parole chiave let e const consentono di definire rispettivamente variabili locali e costanti di ambito blocco.

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

Funzioni freccia

Le funzioni freccia offrono un modo compatto per definire le funzioni all'interno delle espressioni.

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

Corsi

Le classi forniscono un mezzo per organizzare concettualmente il codice con l'eredità. Le classi in V8 sono principalmente zucchero sintattico rispetto all'eredità basata su prototipi di 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)
      

Assegnazioni distrutturate

Le espressioni di assegnazione distrutturante sono un modo rapido per estrarre i valori da array e oggetti in variabili distinte.

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


      

Letterali di modello

I letterali di modello sono letterali di stringa che consentono espressioni incorporate. Ti consentono di evitare dichiarazioni di concatenazione di stringhe più complesse.

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


      

Parametri predefiniti

I parametri predefiniti ti consentono di specificare valori predefiniti per i parametri della funzione nella dichiarazione della funzione. In questo modo, il codice nel corpo della funzione può essere semplificato poiché viene rimossa la necessità di assegnare esplicitamente valori predefiniti ai parametri mancanti.

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

      

Stringhe multilinea

Puoi definire stringhe di più righe utilizzando la stessa sintassi dei letterali di modello. Come per i literali di modello, questa sintassi consente di evitare concatenazioni di stringhe e semplificare le definizioni di stringhe.

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

Attivazione del runtime V8

Se uno script utilizza il runtime Rhino, puoi passare a V8 come segue:

  1. Apri il progetto Apps Script.
  2. A sinistra, fai clic su Impostazioni progetto .
  3. Seleziona la casella di controllo Attiva il runtime Chrome V8.

In alternativa, puoi specificare il runtime dello script direttamente modificando il file manifest dello script:

  1. Apri il progetto Apps Script.
  2. A sinistra, fai clic su Impostazioni progetto .
  3. Seleziona la casella di controllo Mostra il file manifest "appsscript.json" nell'editor.
  4. A sinistra, fai clic su Editor > appsscript.json.
  5. Nel file manifest appsscript.json, imposta il campo runtimeVersion sul valore V8.
  6. In alto, fai clic su Salva progetto .

L'articolo Eseguire la migrazione degli script a V8 illustra altri passaggi da seguire per assicurarti che lo script funzioni correttamente con V8.

Attivazione del runtime Rhino

Se lo script utilizza V8 e devi passare all'utilizzo del runtime Rhino originale, procedi nel seguente modo:

  1. Apri il progetto Apps Script.
  2. A sinistra, fai clic su Impostazioni progetto .
  3. Deseleziona la casella di controllo Abilita il runtime Chrome V8.

In alternativa, modifica il manifest dello script:

  1. Apri il progetto Apps Script.
  2. A sinistra, fai clic su Impostazioni progetto .
  3. Seleziona la casella di controllo Mostra il file manifest "appsscript.json" nell'editor.
  4. A sinistra, fai clic su Editor > appsscript.json.
  5. Nel file manifest appsscript.json, imposta il campo runtimeVersion sul valore DEPRECATED_ES5.
  6. In alto, fai clic su Salva progetto .

Come faccio a eseguire la migrazione degli script esistenti?

La guida Eseguire la migrazione degli script a V8 descrive i passaggi da seguire per eseguire la migrazione di uno script esistente in modo che utilizzi V8. Ciò comporta l'attivazione del runtime V8 e il controllo dello script per verificare eventuali incompatibilità note.

Migrazione automatica degli script a V8

A partire dal 18 febbraio 2020, Google inizierà a eseguire gradualmente la migrazione degli script esistenti che superano il nostro test di compatibilità automatico alla versione 8. Gli script interessati continueranno a funzionare normalmente dopo la migrazione.

Se vuoi disattivare la migrazione automatica di uno script, imposta il campo runtimeVersion nel relativo file manifest su DEPRECATED_ES5. In seguito, puoi scegliere di eseguire manualmente la migrazione dello script a V8 in qualsiasi momento.

Come faccio a segnalare i bug?

La guida all'assistenza spiega come ricevere assistenza per la programmazione su Stack Overflow, cercare segnalazioni di problemi esistenti, segnalare nuovi bug e presentare nuove richieste di funzionalità.