V8 रनटाइम की खास जानकारी

Apps Script और JavaScript में, रनटाइम या रनटाइम एनवायरमेंट में, JavaScript इंजन होता है. यह इंजन, स्क्रिप्ट कोड को पार्स और चलाता है. रनटाइम, मेमोरी को ऐक्सेस करने के तरीके, प्रोग्राम के कंप्यूटर के ऑपरेटिंग सिस्टम के साथ इंटरैक्ट करने के तरीके, और प्रोग्राम के लिए मान्य सिंटैक्स के बारे में बताता है. हर वेब ब्राउज़र में, JavaScript के लिए रनटाइम एनवायरमेंट होता है.

अब तक, Apps Script में Mozilla के Rhino JavaScript इंटरप्रिटर का इस्तेमाल किया जाता रहा है. Rhino ने Apps Script को डेवलपर स्क्रिप्ट को लागू करने का एक आसान तरीका दिया. हालांकि, इसकी वजह से Apps Script को किसी खास JavaScript वर्शन (ES5) से जोड़ना पड़ा. Apps Script के डेवलपर, Rhino रनटाइम का इस्तेमाल करके स्क्रिप्ट में, JavaScript के नए सिंटैक्स और सुविधाओं का इस्तेमाल नहीं कर सकते.

इस समस्या को हल करने के लिए, Apps Script अब V8 रनटाइम के साथ काम करता है. यह रनटाइम, Chrome और Node.js के साथ काम करता है. नए JavaScript सिंटैक्स और सुविधाओं का फ़ायदा पाने के लिए, मौजूदा स्क्रिप्ट को V8 पर माइग्रेट किया जा सकता है.

इस पेज पर, V8 की मदद से चालू की गई नई सुविधाओं के बारे में बताया गया है. साथ ही, अपनी स्क्रिप्ट में इस्तेमाल करने के लिए, V8 को चालू करने का तरीका भी बताया गया है. स्क्रिप्ट को V8 पर माइग्रेट करना में, V8 रनटाइम का इस्तेमाल करने के लिए, मौजूदा स्क्रिप्ट को माइग्रेट करने का तरीका बताया गया है.

V8 रनटाइम की सुविधाएं

V8 रनटाइम का इस्तेमाल करने वाली स्क्रिप्ट, इन सुविधाओं का फ़ायदा ले सकती हैं:

आधुनिक ECMAScript सिंटैक्स

V8 रनटाइम की मदद से काम करने वाली स्क्रिप्ट में, आधुनिक ECMAScript सिंटैक्स का इस्तेमाल किया जा सकता है. इस सिंटैक्स में let, const, और कई अन्य लोकप्रिय सुविधाएं शामिल हैं.

सिंटैक्स में किए गए उन लोकप्रिय सुधारों की छोटी सूची के लिए, V8 सिंटैक्स के उदाहरण देखें जिन्हें V8 रनटाइम का इस्तेमाल करके किया जा सकता है.

फ़ंक्शन की पहचान करने की बेहतर सुविधा

V8 का इस्तेमाल करने वाली स्क्रिप्ट के लिए, Apps Script फ़ंक्शन की पहचान करने की सुविधा को बेहतर बनाया गया है. नया रनटाइम, फ़ंक्शन की परिभाषा के इन फ़ॉर्मैट को पहचानता है:

      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 लॉगिंग सेवा में लॉग लिखती हैं.

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 पर अपने-आप माइग्रेट करना

Google, 18 फ़रवरी, 2020 से, काम करने की जांच के लिए अपने-आप चलने वाले हमारे टूल से पास होने वाली मौजूदा स्क्रिप्ट को V8 पर धीरे-धीरे माइग्रेट करना शुरू कर देगा. जिन स्क्रिप्ट पर असर पड़ा है वे माइग्रेशन के बाद भी सामान्य रूप से काम करती रहेंगी.

अगर आपको किसी स्क्रिप्ट को अपने-आप माइग्रेट होने की सुविधा से ऑप्ट आउट करना है, तो उसके मेनिफ़ेस्ट में runtimeVersion फ़ील्ड को DEPRECATED_ES5 पर सेट करें. इसके बाद, किसी भी समय मैन्युअल तरीके से स्क्रिप्ट को V8 पर माइग्रेट किया जा सकता है.

मैं गड़बड़ियों की शिकायत कैसे करूं?

सहायता गाइड में, Stack Overflow पर प्रोग्रामिंग से जुड़ी मदद पाने, समस्या की मौजूदा रिपोर्ट खोजने, नई गड़बड़ियों की शिकायत करने, और नई सुविधाओं के लिए अनुरोध करने का तरीका बताया गया है.