סקירה כללית של זמן ריצה של V8

ב-Apps Script וב-JavaScript, זמן ריצה או סביבה של זמן ריצה מכילים את מנוע ה-JavaScript שמנתח ומריץ את קוד הסקריפט. סביבת זמן הריצה מספקת כללים לגישה לזיכרון, לאופן שבו התוכנית יכולה לקיים אינטראקציה עם מערכת ההפעלה של המחשב ולתחביר התוכנית שחוקי. לכל דפדפן אינטרנט יש סביבה בסביבת זמן ריצה ל-JavaScript.

בעבר, Apps Script הופעל על ידי המפרש של Mozilla ל-JavaScript‏ Rhino. Rhino סיפק דרך נוחה ל-Apps Script להריץ סקריפטים של מפתחים, אבל הוא גם קשר את Apps Script לגרסה ספציפית של JavaScript‏ (ES5). מפתחי Apps Script לא יכולים להשתמש בתחביר ובתכונות מודרניים יותר של JavaScript בסקריפטים שמשתמשים בסביבת זמן הריצה של Rhino.

כדי לטפל בבעיה הזו, מעכשיו יש תמיכה ב-Apps Script בסביבת זמן הריצה V8 שמפעילה את Chrome ואת Node.js. אתם יכולים להעביר סקריפטים קיימים ל-V8 כדי ליהנות מהתכונות ומהתחביר המודרני של JavaScript.

בדף הזה מוסברות התכונות החדשות שמופעלות על ידי V8 ואיך מפעילים את V8 לשימוש בסקריפטים. במאמר העברת סקריפטים ל-V8 מתוארים השלבים להעברת סקריפטים קיימים לשימוש בסביבת זמן הריצה V8.

תכונות של סביבת זמן הריצה V8

סקריפטים שמשתמשים בסביבת זמן הריצה של V8 יכולים ליהנות מהתכונות הבאות:

תחביר מודרני של ECMAScript

אפשר להשתמש בתחביר ECMAScript מודרני בסקריפטים שמבוססים על סביבת זמן הריצה V8. התחביר הזה כולל את let, את const ועוד תכונות פופולריות רבות.

במאמר דוגמאות לתחביר V8 מופיעה רשימה קצרה של שיפורים פופולריים בתחביר שאפשר לבצע באמצעות סביבת זמן הריצה V8.

זיהוי פונקציות משופר

זיהוי הפונקציות ב-Apps Script משופר בסקריפטים שמשתמשים ב-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 Sheets:

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 Logging.

כדי להציג את היומנים Logger ו-console, לוחצים על יומן הביצוע בחלק העליון של עורך הסקריפט.

הצגת ביצועים

כדי להציג את היסטוריית הביצועים של הסקריפט, פותחים את הפרויקט ב-Apps Script ולוחצים על ביצועים בצד ימין.

דוגמאות לתחביר 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 הן בעיקר תכונות נוחה לשימוש (syntactic sugar) על פני הירושה מבוססת-האב טיפוס של 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!"

      

מחרוזות עם כמה שורות

אפשר להגדיר מחרוזות בכמה שורות באמצעות אותו תחביר של מחרוזות תבנית. בדומה ל-template literals, התחביר הזה מאפשר להימנע משרשור מחרוזות ולפשט את הגדרות המחרוזות.

// 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. פותחים את הפרויקט ב-Apps Script.
  2. בצד ימין, לוחצים על הגדרות הפרויקט .
  3. מסמנים את התיבה Enable Chrome V8 runtime.

לחלופין, אפשר לציין את סביבת זמן הריצה של הסקריפט ישירות על ידי עריכת קובץ המניפסט של הסקריפט:

  1. פותחים את הפרויקט ב-Apps Script.
  2. בצד ימין, לוחצים על הגדרות הפרויקט .
  3. מסמנים את התיבה הצגת קובץ המניפסט 'Appscript.json' בעורך.
  4. בצד ימין, לוחצים על עריכה > appsscript.json.
  5. בקובץ המניפסט appsscript.json, מגדירים את השדה runtimeVersion לערך V8.
  6. בחלק העליון, לוחצים על שמירה של הפרויקט .

במאמר העברת סקריפטים ל-V8 מוסבר מה עוד צריך לעשות כדי לוודא שהסקריפט פועל כמו שצריך באמצעות V8.

הפעלת סביבת זמן הריצה של Rhino

אם הסקריפט שלכם משתמש ב-V8 ואתם צריכים להעביר אותו לשימוש בסביבת זמן הריצה המקורית של Rhino, עליכם לבצע את הפעולות הבאות:

  1. פותחים את הפרויקט ב-Apps Script.
  2. בצד ימין, לוחצים על הגדרות הפרויקט .
  3. מבטלים את הסימון של התיבה הפעלה של 'סביבת זמן הריצה' של Chrome V8.

לחלופין, אפשר לערוך את המניפסט של הסקריפט:

  1. פותחים את הפרויקט ב-Apps Script.
  2. בצד ימין, לוחצים על הגדרות הפרויקט .
  3. מסמנים את התיבה הצגת קובץ המניפסט 'Appscript.json' בעורך.
  4. בצד ימין, לוחצים על עריכה > appsscript.json.
  5. בקובץ המניפסט appsscript.json, מגדירים את השדה runtimeVersion לערך DEPRECATED_ES5.
  6. בחלק העליון, לוחצים על שמירה של הפרויקט .

איך מעבירים סקריפטים קיימים?

במדריך העברת סקריפטים ל-V8 מוסבר איך מעבירים סקריפט קיים ל-V8. לשם כך, צריך להפעיל את סביבת זמן הריצה של V8 ולבדוק אם יש בסקריפט אי-תאימות ידועה.

העברה אוטומטית של סקריפטים ל-V8

החל מ-18 בפברואר 2020, Google תתחיל בהדרגה להעביר סקריפטים קיימים שעוברים את בדיקת התאימות האוטומטית שלנו לגרסה V8. הסקריפטים המושפעים ממשיכים לפעול כרגיל אחרי ההעברה.

אם רוצים לבטל את ההעברה האוטומטית של סקריפט, צריך להגדיר את השדה runtimeVersion במניפסט שלו לערך DEPRECATED_ES5. לאחר מכן, תוכלו להעביר את הסקריפט ל-V8 באופן ידני מתי שתרצו.

איך מדווחים על באגים?

במדריך התמיכה מוסבר איך לקבל עזרה בנושאי תכנות ב-Stack Overflow, לחפש דוחות קיימים על בעיות, לדווח על באגים חדשים ולשלוח בקשות חדשות להוספת תכונות.