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

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

בעבר, Apps Script הופעל על ידי תרגום ה-JavaScript של 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 של אובייקטים מטריגרים ומקריאות חוזרות

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

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

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

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