مروری بر زمان اجرا V8

در Apps Script و JavaScript، یک محیط زمان اجرا یا زمان اجرا حاوی موتور جاوا اسکریپت است که کد اسکریپت را تجزیه و اجرا می کند. Runtime قوانینی را برای نحوه دسترسی به حافظه، نحوه تعامل برنامه با سیستم عامل رایانه و اینکه چه نحوی برنامه قانونی است، ارائه می دهد. هر مرورگر وب دارای یک محیط زمان اجرا برای جاوا اسکریپت است.

از لحاظ تاریخی، Apps Script توسط مفسر جاوا اسکریپت Rhino Mozilla طراحی شده است. در حالی که Rhino راه مناسبی را برای Apps Script برای اجرای اسکریپت های توسعه دهنده ارائه کرد، Apps Script را نیز به یک نسخه جاوا اسکریپت خاص ( ES5 ) گره زد. توسعه دهندگان Apps Script نمی توانند از نحو و ویژگی های مدرن جاوا اسکریپت در اسکریپت های با استفاده از زمان اجرا Rhino استفاده کنند.

برای رفع این نگرانی، اکنون Apps Script توسط زمان اجرا V8 که Chrome و Node.js را تامین می‌کند، پشتیبانی می‌شود. می توانید اسکریپت های موجود را به V8 انتقال دهید تا از نحو و ویژگی های جاوا اسکریپت مدرن استفاده کنید.

این صفحه ویژگی های جدید فعال شده توسط V8 و نحوه فعال کردن V8 را برای استفاده در اسکریپت های خود شرح می دهد. انتقال اسکریپت ها به V8 مراحل انتقال اسکریپت های موجود برای استفاده از زمان اجرا V8 را شرح می دهد.

ویژگی های زمان اجرا V8

اسکریپت هایی که از زمان اجرا V8 استفاده می کنند می توانند از ویژگی های زیر استفاده کنند:

نحو مدرن ECMAScript

می‌توانید از نحو مدرن ECMAScript در اسکریپت‌هایی که توسط زمان اجرا V8 پشتیبانی می‌شوند، استفاده کنید. این نحو شامل let ، const و بسیاری از ویژگی های محبوب دیگر است.

نمونه‌های نحو V8 را برای فهرست کوتاهی از بهبودهای نحوی محبوبی که می‌توانید با استفاده از زمان اجرا V8 انجام دهید، ببینید.

تشخیص عملکرد بهبود یافته

تشخیص عملکرد برنامه‌های اسکریپت برای اسکریپت‌های با استفاده از 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 ، در بالای ویرایشگر اسکریپت، روی 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 عمدتاً قند نحوی بر وراثت مبتنی بر نمونه اولیه جاوا اسکریپت هستند.

// 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 runtime را انتخاب کنید.

همچنین می‌توانید با ویرایش فایل مانیفست اسکریپت، زمان اجرای اسکریپت را مستقیماً مشخص کنید:

  1. پروژه Apps Script را باز کنید.
  2. در سمت چپ، روی تنظیمات پروژه کلیک کنید.
  3. کادر بررسی نمایش فایل مانیفست "appsscript.json" در ویرایشگر را انتخاب کنید.
  4. در سمت چپ، روی Editor > appsscript.json کلیک کنید.
  5. در فایل مانیفست appsscript.json ، قسمت runtimeVersion را روی مقدار V8 تنظیم کنید.
  6. در بالا، روی پروژه کلیک کنید.

انتقال اسکریپت ها به V8 مراحل دیگری را توضیح می دهد که باید برای اطمینان از عملکرد خوب اسکریپت خود با استفاده از V8 انجام دهید.

فعال کردن زمان اجرای Rhino

اگر اسکریپت شما از V8 استفاده می کند و باید آن را برای استفاده از زمان اجرا اصلی Rhino تغییر دهید، موارد زیر را انجام دهید:

  1. پروژه Apps Script را باز کنید.
  2. در سمت چپ، روی تنظیمات پروژه کلیک کنید.
  3. کادر بررسی Enable Chrome V8 runtime را پاک کنید.

از طرف دیگر، مانیفست اسکریپت خود را ویرایش کنید:

  1. پروژه Apps Script را باز کنید.
  2. در سمت چپ، روی تنظیمات پروژه کلیک کنید.
  3. کادر بررسی نمایش فایل مانیفست "appsscript.json" در ویرایشگر را انتخاب کنید.
  4. در سمت چپ، روی Editor > appsscript.json کلیک کنید.
  5. در فایل مانیفست appsscript.json ، قسمت runtimeVersion را روی مقدار DEPRECATED_ES5 تنظیم کنید.
  6. در بالا، روی پروژه کلیک کنید.

چگونه اسکریپت های موجود را منتقل کنم؟

راهنمای انتقال اسکریپت ها به V8 مراحلی را که باید برای انتقال اسکریپت موجود برای استفاده از V8 انجام دهید، شرح می دهد. این شامل فعال کردن زمان اجرا V8 و بررسی اسکریپت برای هرگونه ناسازگاری شناخته شده است.

انتقال خودکار اسکریپت ها به V8

از 18 فوریه 2020، Google انتقال تدریجی اسکریپت‌های موجود را که تست سازگاری خودکار ما را به V8 گذرانده‌اند، آغاز می‌کند. اسکریپت های آسیب دیده پس از مهاجرت به کار خود ادامه می دهند.

اگر می‌خواهید اسکریپتی را از انتقال خودکار انصراف دهید، قسمت runtimeVersion را در مانیفست آن روی DEPRECATED_ES5 تنظیم کنید. پس از آن می توانید انتخاب کنید که اسکریپت به صورت دستی به V8 منتقل شود .

چگونه اشکالات را گزارش کنم؟

راهنمای پشتیبانی نحوه دریافت کمک برنامه‌نویسی در Stack Overflow، جستجوی گزارش‌های مشکلات موجود، ثبت اشکالات جدید و درخواست ویژگی‌های جدید را توضیح می‌دهد.