Ringkasan runtime V8

Di Apps Script dan JavaScript, runtime atau lingkungan runtime berisi mesin JavaScript yang mengurai dan menjalankan kode skrip. Runtime menyediakan aturan tentang cara mengakses memori, cara program dapat berinteraksi dengan sistem operasi komputer, dan sintaksis program yang valid. Setiap browser web memiliki lingkungan runtime untuk JavaScript.

Sebelumnya, Apps Script didukung oleh interpreter JavaScript Rhino dari Mozilla. Meskipun Rhino memberikan cara yang mudah bagi Apps Script untuk mengeksekusi skrip developer, Rhino juga mengikat Apps Script ke versi JavaScript tertentu (ES5). Developer Apps Script tidak dapat menggunakan sintaksis dan fitur JavaScript yang lebih modern dalam skrip yang menggunakan runtime Rhino.

Untuk mengatasi masalah ini, Apps Script kini didukung oleh runtime V8 yang mendukung Chrome dan Node.js. Anda dapat memigrasikan skrip yang ada ke V8 untuk memanfaatkan sintaks dan fitur JavaScript modern.

Halaman ini menjelaskan fitur baru yang diaktifkan oleh V8 dan cara mengaktifkan V8 untuk digunakan dalam skrip Anda. Memigrasikan skrip ke V8 menjelaskan langkah-langkah untuk memigrasikan skrip yang ada agar menggunakan runtime V8.

Fitur runtime V8

Skrip yang menggunakan runtime V8 dapat memanfaatkan fitur berikut:

Sintaksis ECMAScript modern

Anda dapat menggunakan sintaksis ECMAScript modern dalam skrip yang didukung oleh runtime V8. Sintaksis ini mencakup let, const, dan banyak fitur populer lainnya.

Lihat contoh sintaksis V8 untuk daftar singkat peningkatan sintaksis populer yang dapat Anda lakukan menggunakan runtime V8.

Deteksi fungsi yang lebih baik

Deteksi fungsi Apps Script ditingkatkan untuk skrip yang menggunakan V8. Runtime baru mengenali format definisi fungsi berikut:

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

Memanggil metode objek dari pemicu dan callback

Skrip yang menggunakan V8 dapat memanggil metode objek dan metode statis class dari tempat tempat Anda sudah dapat memanggil metode library. Tempat ini mencakup hal berikut:

Contoh V8 berikut menunjukkan penggunaan metode objek saat membuat item menu di Google Spreadsheet:

function onOpen() {
  const 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();
}

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

Melihat log

Apps Script menyediakan dua layanan logging: layanan Logger dan class console. Kedua layanan ini menulis log ke layanan Stackdriver Logging yang sama.

Untuk menampilkan log Logger dan console, di bagian atas editor skrip, klik Execution log.

Melihat eksekusi

Untuk melihat histori eksekusi skrip, buka project Apps Script dan di sebelah kiri, klik Eksekusi .

Contoh sintaksis V8

Berikut adalah daftar singkat fitur sintaksis populer yang tersedia untuk skrip yang menggunakan runtime V8.

let dan const

Kata kunci let dan const memungkinkan Anda menentukan variabel lokal cakupan blok dan konstanta cakupan blok.

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

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

Fungsi panah

Fungsi panah memberikan cara ringkas untuk menentukan fungsi dalam ekspresi.

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

Class

Class menyediakan cara untuk mengatur kode secara konseptual dengan pewarisan. Class di V8 terutama merupakan sintaksis yang lebih mudah dipahami daripada pewarisan berbasis prototipe 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)
      

Penugasan destrukturisasi

Ekspresi penetapan penguraian adalah cara cepat untuk menguraikan nilai dari array dan objek ke dalam variabel yang berbeda.

// 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 a = [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
const data = {a: 12, b: false, c: 'blue'};
const {a, c} = data;
console.log(a, c);  // Outputs 12 "blue"


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


      

Literal template

Literal template adalah literal string yang memungkinkan ekspresi tersemat. Dengan fitur ini, Anda dapat menghindari pernyataan penggabungan string yang lebih rumit.

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


      

Parameter default

Parameter default memungkinkan Anda menentukan nilai default untuk parameter fungsi dalam deklarasi fungsi. Hal ini dapat menyederhanakan kode di isi fungsi karena menghilangkan kebutuhan untuk menetapkan nilai default secara eksplisit ke parameter yang tidak ada.

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

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

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

      

String multi-baris

Anda dapat menentukan string multiline menggunakan sintaksis yang sama dengan literal template. Seperti literal template, sintaksis ini memungkinkan Anda menghindari penggabungan string dan menyederhanakan definisi string.

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

Batasan waktu proses V8

Runtime V8 Apps Script bukan lingkungan Node.js atau browser standar. Hal ini dapat menyebabkan masalah kompatibilitas saat Anda memanggil library pihak ketiga atau mengadaptasi contoh kode dari lingkungan JavaScript lain.

API yang Tidak Tersedia

API JavaScript standar berikut TIDAK tersedia di runtime V8 Apps Script:

  • Timer: setTimeout, setInterval, clearTimeout, clearInterval
  • Streaming: ReadableStream, WritableStream, TextEncoder, TextDecoder
  • Web API: fetch, FormData, File, Blob, URL, URLSearchParams, DOMException, atob, btoa
  • Kripto: crypto, SubtleCrypto
  • Objek Global: window, navigator, performance, process (Node.js)

Gunakan API Apps Script berikut sebagai alternatif:

Untuk API tanpa alternatif Apps Script, seperti TextEncoder, Anda terkadang dapat menggunakan polyfill. Polyfill adalah library yang mereplikasi fungsi API yang tidak tersedia secara default di lingkungan runtime. Sebelum menggunakan polyfill, pastikan polyfill tersebut kompatibel dengan runtime V8 Apps Script.

Batasan asinkron

Runtime V8 mendukung sintaksis async dan await serta objek Promise. Namun, lingkungan runtime Apps Script pada dasarnya bersifat sinkron.

  • Microtask (Didukung): Runtime memproses antrean microtask (tempat callback Promise.then dan penyelesaian await terjadi) setelah stack panggilan saat ini dibersihkan.
  • Macrotask (Tidak Didukung): Apps Script tidak memiliki loop peristiwa standar untuk macrotask. Fungsi seperti setTimeout dan setInterval tidak tersedia.
  • Pengecualian WebAssembly: WebAssembly API adalah satu-satunya fitur bawaan yang beroperasi secara non-blocking dalam runtime, sehingga memungkinkan pola kompilasi asinkron tertentu (WebAssembly.instantiate).

Semua operasi I/O, seperti UrlFetchApp.fetch, bersifat memblokir. Untuk mencapai permintaan jaringan paralel, gunakan UrlFetchApp.fetchAll.

Batasan kelas

Runtime V8 memiliki batasan khusus terkait fitur class ES6+ modern:

  • Kolom Pribadi: Kolom class pribadi (misalnya, #field) tidak didukung dan menyebabkan error parsing. Pertimbangkan untuk menggunakan penutupan atau WeakMap untuk enkapsulasi yang sebenarnya.
  • Kolom Statis: Deklarasi kolom statis langsung dalam isi class (misalnya, static count = 0;) tidak didukung. Tetapkan properti statis ke class setelah definisinya (misalnya, MyClass.count = 0;).

Batasan modul

  • Modul ES6: Runtime V8 tidak mendukung modul ES6 (import / export). Untuk menggunakan library, Anda harus menggunakan mekanisme library Apps Script atau menggabungkan kode dan dependensinya ke dalam satu file skrip. (Pelacak Masalah)
  • Urutan Eksekusi File: Semua file skrip di project Anda dieksekusi dalam cakupan global. Sebaiknya hindari kode tingkat teratas dengan efek samping dan pastikan fungsi dan class ditentukan sebelum digunakan di seluruh file. Urutkan file Anda secara eksplisit di editor jika ada dependensi di antara file tersebut.

Mengaktifkan runtime V8

Jika skrip menggunakan runtime Rhino, Anda dapat mengalihkannya ke V8 dengan melakukan hal berikut:

  1. Buka project Apps Script.
  2. Di sebelah kiri, klik Project Settings .
  3. Centang kotak Aktifkan waktu proses Chrome V8.

Atau, Anda dapat menentukan runtime skrip secara langsung dengan mengedit file manifes skrip:

  1. Buka project Apps Script.
  2. Di sebelah kiri, klik Project Settings .
  3. Pilih kotak centang Tampilkan file manifes "appsscript.json" dalam editor.
  4. Di sebelah kiri, klik Editor > appsscript.json.
  5. Di file manifes appsscript.json, tetapkan kolom runtimeVersion ke nilai V8.
  6. Di bagian atas, klik Simpan project .

Memigrasikan skrip ke V8 menjelaskan langkah-langkah lain yang harus Anda lakukan untuk memastikan skrip Anda berfungsi dengan baik menggunakan V8.

Mengaktifkan runtime Rhino

Jika skrip Anda menggunakan V8 dan Anda perlu mengalihkannya untuk menggunakan runtime Rhino asli, lakukan hal berikut:

  1. Buka project Apps Script.
  2. Di sebelah kiri, klik Project Settings .
  3. Hapus centang pada kotak Enable Chrome V8 runtime.

Atau, edit manifes skrip Anda:

  1. Buka project Apps Script.
  2. Di sebelah kiri, klik Project Settings .
  3. Pilih kotak centang Tampilkan file manifes "appsscript.json" dalam editor.
  4. Di sebelah kiri, klik Editor > appsscript.json.
  5. Di file manifes appsscript.json, tetapkan kolom runtimeVersion ke nilai DEPRECATED_ES5.
  6. Di bagian atas, klik Simpan project .

Bagaimana cara memigrasikan skrip yang ada?

Panduan Memigrasikan skrip ke V8 menjelaskan langkah-langkah yang perlu Anda lakukan untuk memigrasikan skrip yang ada agar menggunakan V8. Hal ini melibatkan pengaktifan runtime V8 dan pemeriksaan script untuk mengetahui apakah ada inkompatibilitas yang diketahui.

Migrasi skrip otomatis ke V8

Mulai 18 Februari 2020, Google akan mulai memigrasikan secara bertahap skrip yang ada yang lulus uji kompatibilitas otomatis kami ke V8. Skrip yang terpengaruh terus berfungsi secara normal setelah migrasi.

Jika Anda ingin menghentikan keikutsertaan skrip dari migrasi otomatis, tetapkan kolom runtimeVersion dalam manifesnya ke DEPRECATED_ES5. Anda dapat memilih untuk memigrasikan skrip ke V8 secara manual kapan saja setelahnya.

Bagaimana cara melaporkan bug?

Panduan dukungan menjelaskan cara mendapatkan bantuan pemrograman di Stack Overflow, menelusuri laporan masalah yang ada, mengajukan bug baru, dan membuat permintaan fitur baru.