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

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

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

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

בדף הזה מתוארות התכונות החדשות שמופעלות על ידי 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 () => {}

קריאה לשיטות של אובייקט (methods) מטריגרים ומקריאות חוזרות (callback)

בסקריפטים שמשתמשים ב-V8 אפשר לקרוא ל-methods של אובייקטים ולסווג שיטות סטטיות ממקומות שבהם אפשר כבר לקרוא ל-methods של הספרייה. המקומות האלה כוללים:

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

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

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

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

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

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

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

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

  1. פותחים את פרויקט Apps Script.
  2. בצד ימין, לוחצים על Project Settings (הגדרות הפרויקט) .
  3. מסמנים את התיבה Show "appsscript.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, לחפש בדוחות על בעיות קיימות, איך לדווח על באגים חדשים ולשלוח בקשות להוספת תכונות חדשות.