স্ক্রিপ্টগুলিকে V8 রানটাইমে স্থানান্তর করুন

৩১ জানুয়ারী, ২০২৬ তারিখের পরে রাইনো রানটাইম বন্ধ হয়ে যাচ্ছে। যদি আপনার কাছে রাইনো রানটাইম ব্যবহার করে এমন কোনও স্ক্রিপ্ট থাকে, তাহলে আপনাকে অবশ্যই স্ক্রিপ্টটি V8 এ স্থানান্তর করতে হবে।

প্রায়শই স্ক্রিপ্টে V8 সিনট্যাক্স এবং বৈশিষ্ট্য যোগ করার একমাত্র পূর্বশর্ত হল V8 রানটাইম সক্ষম করা । তবে, কিছু অসঙ্গতি এবং অন্যান্য পার্থক্য রয়েছে যার ফলে V8 রানটাইমে একটি স্ক্রিপ্ট ব্যর্থ হতে পারে বা অপ্রত্যাশিতভাবে আচরণ করতে পারে। V8 ব্যবহার করার জন্য একটি স্ক্রিপ্ট স্থানান্তর করার সময়, আপনাকে অবশ্যই এই সমস্যাগুলির জন্য স্ক্রিপ্ট প্রকল্পে অনুসন্ধান করতে হবে এবং আপনি যে কোনও সমস্যা খুঁজে পেলে তা সংশোধন করতে হবে।

V8 মাইগ্রেশন পদ্ধতি

V8 তে একটি স্ক্রিপ্ট স্থানান্তর করতে, এই পদ্ধতিটি অনুসরণ করুন:

  1. স্ক্রিপ্টের জন্য V8 রানটাইম সক্ষম করুন । অ্যাপস স্ক্রিপ্ট প্রজেক্টের ম্যানিফেস্ট ব্যবহার করে runtimeVersion পরীক্ষা করা যেতে পারে।
  2. নিম্নলিখিত অসঙ্গতিগুলি সাবধানতার সাথে পর্যালোচনা করুন। আপনার স্ক্রিপ্টটি পরীক্ষা করে দেখুন যে কোনও অসঙ্গতি উপস্থিত আছে কিনা; যদি এক বা একাধিক অসঙ্গতি উপস্থিত থাকে, তাহলে সমস্যাটি দূর করতে বা এড়াতে আপনার স্ক্রিপ্ট কোডটি সামঞ্জস্য করুন।
  3. নিম্নলিখিত অন্যান্য পার্থক্যগুলি সাবধানতার সাথে পর্যালোচনা করুন। তালিকাভুক্ত কোনও পার্থক্য আপনার কোডের আচরণকে প্রভাবিত করে কিনা তা নির্ধারণ করতে আপনার স্ক্রিপ্টটি পরীক্ষা করুন। আচরণটি সংশোধন করার জন্য আপনার স্ক্রিপ্টটি সামঞ্জস্য করুন।
  4. একবার আপনি আবিষ্কৃত কোনও অসঙ্গতি বা অন্যান্য পার্থক্য সংশোধন করার পরে, আপনি V8 সিনট্যাক্স এবং অন্যান্য বৈশিষ্ট্যগুলি ব্যবহার করার জন্য আপনার কোড আপডেট করা শুরু করতে পারেন।
  5. আপনার কোড সমন্বয় সম্পন্ন করার পর, আপনার স্ক্রিপ্টটি প্রত্যাশা অনুযায়ী আচরণ করছে কিনা তা নিশ্চিত করার জন্য পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন।
  6. যদি আপনার স্ক্রিপ্টটি একটি ওয়েব অ্যাপ বা প্রকাশিত অ্যাড-অন হয়, তাহলে আপনাকে V8 সমন্বয় সহ স্ক্রিপ্টের একটি নতুন সংস্করণ তৈরি করতে হবে এবং নতুন তৈরি সংস্করণে স্থাপনাটি নির্দেশ করতে হবে। ব্যবহারকারীদের জন্য V8 সংস্করণটি উপলব্ধ করতে, আপনাকে এই সংস্করণ সহ স্ক্রিপ্টটি পুনরায় প্রকাশ করতে হবে।
  7. যদি আপনার স্ক্রিপ্টটি লাইব্রেরি হিসেবে ব্যবহৃত হয়, তাহলে আপনার স্ক্রিপ্টের একটি নতুন সংস্করণযুক্ত স্থাপনা তৈরি করুন। আপনার লাইব্রেরি ব্যবহারকারী সমস্ত স্ক্রিপ্ট এবং ব্যবহারকারীদের কাছে এই নতুন সংস্করণটি পৌঁছে দিন, তাদের V8-সক্ষম সংস্করণে আপডেট করার নির্দেশ দিন। যাচাই করুন যে আপনার লাইব্রেরির কোনও পুরানো, রাইনো-ভিত্তিক সংস্করণ আর সক্রিয় ব্যবহারে নেই বা অ্যাক্সেসযোগ্য নয়।
  8. যাচাই করুন যে আপনার স্ক্রিপ্টের কোনও ইনস্ট্যান্স এখনও লিগ্যাসি রাইনো রানটাইমে কাজ করছে না। যাচাই করুন যে সমস্ত ডিপ্লয়মেন্ট V8-তে থাকা একটি সংস্করণের সাথে সম্পর্কিত। পুরানো ডিপ্লয়মেন্ট আর্কাইভ করুন। সমস্ত সংস্করণ পর্যালোচনা করুন এবং V8 রানটাইম ব্যবহার করছে না এমন সংস্করণগুলি মুছে ফেলুন।

অসঙ্গতি

দুর্ভাগ্যবশত, মূল রাইনো-ভিত্তিক অ্যাপস স্ক্রিপ্ট রানটাইম বেশ কিছু অ-মানক ECMAScript আচরণের অনুমতি দিয়েছিল। যেহেতু V8 স্ট্যান্ডার্ড সম্মত, তাই মাইগ্রেশনের পরে এই আচরণগুলি সমর্থিত নয়। V8 রানটাইম সক্ষম হয়ে গেলে এই সমস্যাগুলি সংশোধন করতে ব্যর্থ হলে ত্রুটি বা ভাঙা স্ক্রিপ্ট আচরণ দেখা দেয়।

নিম্নলিখিত বিভাগগুলিতে V8-এ মাইগ্রেশনের সময় আপনার স্ক্রিপ্ট কোড সংশোধন করার জন্য এই প্রতিটি আচরণ এবং পদক্ষেপগুলি বর্ণনা করা হয়েছে।

for each(variable in object)

জাভাস্ক্রিপ্ট ১.৬-তে for each (variable in object) স্টেটমেন্ট যোগ করা হয়েছে এবং for...of পক্ষে সরানো হয়েছে।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, for each (variable in object) স্টেটমেন্ট ব্যবহার করা এড়িয়ে চলুন

পরিবর্তে, for (variable in object) ব্যবহার করুন:

// Rhino runtime
var obj = {a: 1, b: 2, c: 3};

// Don't use 'for each' in V8
for each (var value in obj) {
  Logger.log("value = %s", value);
}
      
// V8 runtime
var obj = {a: 1, b: 2, c: 3};

for (var key in obj) {  // OK in V8
  var value = obj[key];
  Logger.log("value = %s", value);
}
      

Date.prototype.getYear() এড়িয়ে চলুন

মূল Rhino রানটাইমে, Date.prototype.getYear() ১৯০০-১৯৯৯ সাল পর্যন্ত বছরগুলির জন্য দুই-অঙ্কের বছর প্রদান করে, কিন্তু অন্যান্য তারিখগুলির জন্য চার-অঙ্কের বছর প্রদান করে, যা জাভাস্ক্রিপ্ট ১.২ এবং তার আগের সংস্করণগুলিতে ছিল।

V8 রানটাইমে, Date.prototype.getYear() ECMAScript মান অনুসারে বছরের বিয়োগ 1900 প্রদান করে।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, সর্বদা Date.prototype.getFullYear() ব্যবহার করুন , যা তারিখ নির্বিশেষে চার-অঙ্কের বছর প্রদান করে।

নাম হিসেবে সংরক্ষিত কীওয়ার্ড ব্যবহার করা এড়িয়ে চলুন

ECMAScript ফাংশন এবং ভেরিয়েবলের নামে কিছু সংরক্ষিত কীওয়ার্ড ব্যবহার নিষিদ্ধ করে। Rhino রানটাইম এই শব্দগুলির অনেকগুলিকে অনুমতি দেয়, তাই যদি আপনার কোড এগুলি ব্যবহার করে, তাহলে আপনাকে অবশ্যই আপনার ফাংশন বা ভেরিয়েবলের নাম পরিবর্তন করতে হবে।

V8 তে আপনার স্ক্রিপ্টটি মাইগ্রেট করার সময়, সংরক্ষিত কীওয়ার্ড ব্যবহার করে ভেরিয়েবল বা ফাংশনের নামকরণ এড়িয়ে চলুন । name কীওয়ার্ড ব্যবহার এড়াতে যেকোনো ভেরিয়েবল বা ফাংশনের নাম পরিবর্তন করুন। নাম হিসাবে কীওয়ার্ডের সাধারণ ব্যবহার হল class , import এবং export

const ভেরিয়েবল পুনরায় বরাদ্দ করা এড়িয়ে চলুন

মূল Rhino রানটাইমে, আপনি const ব্যবহার করে একটি ভেরিয়েবল ঘোষণা করতে পারেন যার অর্থ প্রতীকের মান কখনও পরিবর্তিত হয় না এবং প্রতীকের ভবিষ্যতের অ্যাসাইনমেন্টগুলি উপেক্ষা করা হয়।

নতুন V8 রানটাইমে, const কীওয়ার্ডটি স্ট্যান্ডার্ড সম্মত এবং const হিসেবে ঘোষিত একটি ভেরিয়েবলকে অ্যাসাইন করার ফলে একটি TypeError: Assignment to constant variable runtime ত্রুটি দেখা দেয়।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, const ভেরিয়েবলের মান পুনরায় বরাদ্দ করার চেষ্টা করবেন না :

// Rhino runtime
const x = 1;
x = 2;          // No error
console.log(x); // Outputs 1
      
// V8 runtime
const x = 1;
x = 2;          // Throws TypeError
console.log(x); // Never executed
      

XML লিটারেল এবং XML অবজেক্ট এড়িয়ে চলুন

ECMAScript-এর এই অ-মানক এক্সটেনশনটি Apps Script প্রকল্পগুলিকে সরাসরি XML সিনট্যাক্স ব্যবহার করার অনুমতি দেয়।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, সরাসরি XML লিটারেলস বা XML অবজেক্ট ব্যবহার করা এড়িয়ে চলুন

পরিবর্তে, XML পার্স করতে XmlService ব্যবহার করুন:

// V8 runtime
var incompatibleXml1 = <container><item/></container>;             // Don't use
var incompatibleXml2 = new XML('<container><item/></container>');  // Don't use

var xml3 = XmlService.parse('<container><item/></container>');     // OK
      

__iterator__ ব্যবহার করে কাস্টম ইটারেটর ফাংশন তৈরি করবেন না।

জাভাস্ক্রিপ্ট ১.৭ একটি বৈশিষ্ট্য যুক্ত করেছে যা যেকোনো ক্লাসে একটি কাস্টম ইটারেটর যোগ করার অনুমতি দেয়, সেই ক্লাসের প্রোটোটাইপে একটি __iterator__ ফাংশন ঘোষণা করে; এটি ডেভেলপারদের সুবিধার্থে অ্যাপস স্ক্রিপ্টের রাইনো রানটাইমেও যোগ করা হয়েছিল। তবে, এই বৈশিষ্ট্যটি কখনই ECMA-262 স্ট্যান্ডার্ডের অংশ ছিল না এবং ECMAScript-সম্মত জাভাস্ক্রিপ্ট ইঞ্জিনগুলিতে এটি সরানো হয়েছিল। V8 ব্যবহারকারী স্ক্রিপ্টগুলি এই ইটারেটর নির্মাণ ব্যবহার করতে পারে না।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, কাস্টম ইটারেটর তৈরি করতে __iterator__ ফাংশনটি এড়িয়ে চলুন । পরিবর্তে, ECMAScript 6 ইটারেটর ব্যবহার করুন।

নিম্নলিখিত অ্যারের গঠন বিবেচনা করুন:

// Create a sample array
var myArray = ['a', 'b', 'c'];
// Add a property to the array
myArray.foo = 'bar';

// The default behavior for an array is to return keys of all properties,
//  including 'foo'.
Logger.log("Normal for...in loop:");
for (var item in myArray) {
  Logger.log(item);            // Logs 0, 1, 2, foo
}

// To only log the array values with `for..in`, a custom iterator can be used.
      

নিম্নলিখিত কোড উদাহরণগুলি দেখায় যে রাইনো রানটাইমে কীভাবে একটি ইটারেটর তৈরি করা যেতে পারে এবং V8 রানটাইমে কীভাবে একটি প্রতিস্থাপন ইটারেটর তৈরি করা যায়:

// Rhino runtime custom iterator
function ArrayIterator(array) {
  this.array = array;
  this.currentIndex = 0;
}

ArrayIterator.prototype.next = function() {
  if (this.currentIndex
      >= this.array.length) {
    throw StopIteration;
  }
  return "[" + this.currentIndex
    + "]=" + this.array[this.currentIndex++];
};

// Direct myArray to use the custom iterator
myArray.__iterator__ = function() {
  return new ArrayIterator(this);
}


Logger.log("With custom Rhino iterator:");
for (var item in myArray) {
  // Logs [0]=a, [1]=b, [2]=c
  Logger.log(item);
}
      
// V8 runtime (ECMAScript 6) custom iterator
myArray[Symbol.iterator] = function() {
  var currentIndex = 0;
  var array = this;

  return {
    next: function() {
      if (currentIndex < array.length) {
        return {
          value: "[${currentIndex}]="
            + array[currentIndex++],
          done: false};
      } else {
        return {done: true};
      }
    }
  };
}

Logger.log("With V8 custom iterator:");
// Must use for...of since
//   for...in doesn't expect an iterable.
for (var item of myArray) {
  // Logs [0]=a, [1]=b, [2]=c
  Logger.log(item);
}
      

শর্তসাপেক্ষ ক্যাচ ক্লজ এড়িয়ে চলুন

V8 রানটাইম catch..if শর্তসাপেক্ষ catch ক্লজ সমর্থন করে না, কারণ সেগুলি স্ট্যান্ডার্ড-সম্মত নয়।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, catch বডির ভিতরে যেকোনো catch কন্ডিশনাল সরান :

// Rhino runtime

try {
  doSomething();
} catch (e if e instanceof TypeError) {  // Don't use
  // Handle exception
}
      
// V8 runtime
try {
  doSomething();
} catch (e) {
  if (e instanceof TypeError) {
    // Handle exception
  }
}

Object.prototype.toSource() ব্যবহার করা এড়িয়ে চলুন

জাভাস্ক্রিপ্ট ১.৩-এ একটি Object.prototype.toSource() পদ্ধতি ছিল যা কখনও কোনও ECMAScript স্ট্যান্ডার্ডের অংশ ছিল না। এটি V8 রানটাইমে সমর্থিত নয়।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, আপনার কোড থেকে Object.prototype.toSource() এর যেকোনো ব্যবহার সরিয়ে ফেলুন

অন্যান্য পার্থক্য

স্ক্রিপ্ট ব্যর্থতার কারণ হতে পারে এমন পূর্ববর্তী অসঙ্গতিগুলি ছাড়াও, আরও কিছু পার্থক্য রয়েছে যা সংশোধন না করা হলে, অপ্রত্যাশিত V8 রানটাইম স্ক্রিপ্ট আচরণের কারণ হতে পারে।

এই অপ্রত্যাশিত চমক এড়াতে আপনার স্ক্রিপ্ট কোড কীভাবে আপডেট করবেন তা নিম্নলিখিত বিভাগগুলিতে ব্যাখ্যা করা হয়েছে।

লোকেল-নির্দিষ্ট তারিখ এবং সময় বিন্যাস সামঞ্জস্য করুন

V8 রানটাইমে Rhino এর তুলনায় Date পদ্ধতিগুলি toLocaleString() , toLocaleDateString() , এবং toLocaleTimeString() ভিন্নভাবে আচরণ করে।

রাইনোতে, ডিফল্ট ফর্ম্যাট হল দীর্ঘ ফর্ম্যাট , এবং পাস করা যেকোনো প্যারামিটার উপেক্ষা করা হয়।

V8 রানটাইমে, ডিফল্ট ফর্ম্যাট হল সংক্ষিপ্ত ফর্ম্যাট এবং পাস করা প্যারামিটারগুলি ECMA স্ট্যান্ডার্ড অনুসারে পরিচালনা করা হয় (বিস্তারিত জানার জন্য toLocaleDateString() ডকুমেন্টেশন দেখুন)।

আপনার স্ক্রিপ্টটি V8 তে স্থানান্তর করার সময়, লোকেল-নির্দিষ্ট তারিখ এবং সময় পদ্ধতির আউটপুট সম্পর্কিত আপনার কোডের প্রত্যাশা পরীক্ষা করুন এবং সামঞ্জস্য করুন :

// Rhino runtime
var event = new Date(
  Date.UTC(2012, 11, 21, 12));

// Outputs "December 21, 2012" in Rhino
console.log(event.toLocaleDateString());

// Also outputs "December 21, 2012",
//  ignoring the parameters passed in.
console.log(event.toLocaleDateString(
    'de-DE',
    { year: 'numeric',
      month: 'long',
      day: 'numeric' }));
// V8 runtime
var event = new Date(
  Date.UTC(2012, 11, 21, 12));

// Outputs "12/21/2012" in V8
console.log(event.toLocaleDateString());

// Outputs "21. Dezember 2012"
console.log(event.toLocaleDateString(
    'de-DE',
    { year: 'numeric',
      month: 'long',
      day: 'numeric' }));
      

Error.fileName এবং Error.lineNumber ব্যবহার করা এড়িয়ে চলুন

V8 রানটাইমে, স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট Error অবজেক্টটি কনস্ট্রাক্টর প্যারামিটার বা অবজেক্ট প্রোপার্টি হিসেবে fileName বা lineNumber সমর্থন করে না।

আপনার স্ক্রিপ্টটি V8 এ স্থানান্তর করার সময়, Error.fileName এবং Error.lineNumber এর উপর নির্ভরতা সরিয়ে ফেলুন

একটি বিকল্প হল Error.prototype.stack ব্যবহার করা। এই স্ট্যাকটিও অ-মানক, কিন্তু V8 তে সমর্থিত। দুটি প্ল্যাটফর্ম দ্বারা উত্পাদিত স্ট্যাক ট্রেসের ফর্ম্যাটটি কিছুটা আলাদা:

// Rhino runtime Error.prototype.stack
// stack trace format
at filename:92 (innerFunction)
at filename:97 (outerFunction)
// V8 runtime Error.prototype.stack
// stack trace format
Error: error message
at innerFunction (filename:92:11)
at outerFunction (filename:97:5)
      

স্ট্রিংফাইড এনাম অবজেক্টের হ্যান্ডলিং সামঞ্জস্য করুন

মূল Rhino রানটাইমে, একটি enum অবজেক্টে JavaScript JSON.stringify() পদ্ধতি ব্যবহার করলে শুধুমাত্র {} ফেরত আসে।

V8-তে, একটি enum অবজেক্টে একই পদ্ধতি ব্যবহার করলে enum নামটি পুনরায় সেট করা হয়।

আপনার স্ক্রিপ্টটি V8 তে স্থানান্তর করার সময়, enum objects-এ JSON.stringify() এর আউটপুট সম্পর্কিত আপনার কোডের প্রত্যাশা পরীক্ষা করুন এবং সামঞ্জস্য করুন :

// Rhino runtime
var enumName =
  JSON.stringify(Charts.ChartType.BUBBLE);

// enumName evaluates to {}
// V8 runtime
var enumName =
  JSON.stringify(Charts.ChartType.BUBBLE);

// enumName evaluates to "BUBBLE"

অনির্ধারিত পরামিতিগুলির পরিচালনা সামঞ্জস্য করুন

মূল রাইনো রানটাইমে, একটি পদ্ধতিতে undefined প্যারামিটার হিসেবে পাস করার ফলে "undefined" স্ট্রিংটি সেই পদ্ধতিতে পাস হত।

V8-তে, undefined methods-এ পাস করা null পাস করার সমতুল্য।

আপনার স্ক্রিপ্টটি V8 তে স্থানান্তর করার সময়, undefined প্যারামিটারগুলির ক্ষেত্রে আপনার কোডের প্রত্যাশা পরীক্ষা করুন এবং সামঞ্জস্য করুন :

// Rhino runtime
SpreadsheetApp.getActiveRange()
    .setValue(undefined);

// The active range now has the string
// "undefined"  as its value.
      
// V8 runtime
SpreadsheetApp.getActiveRange()
    .setValue(undefined);

// The active range now has no content, as
// setValue(null) removes content from
// ranges.

গ্লোবাল this হ্যান্ডলিং সামঞ্জস্য করুন

রাইনো রানটাইম এটি ব্যবহার করে এমন স্ক্রিপ্টগুলির জন্য একটি অন্তর্নিহিত বিশেষ প্রেক্ষাপট সংজ্ঞায়িত করে। স্ক্রিপ্ট কোড এই অন্তর্নিহিত প্রেক্ষাপটে চলে, যা প্রকৃত গ্লোবাল this থেকে আলাদা। এর অর্থ হল কোডে "গ্লোবাল this " এর রেফারেন্সগুলি আসলে বিশেষ প্রেক্ষাপটে মূল্যায়ন করে, যেখানে কেবল স্ক্রিপ্টে সংজ্ঞায়িত কোড এবং ভেরিয়েবল থাকে। অন্তর্নির্মিত অ্যাপস স্ক্রিপ্ট পরিষেবা এবং ECMAScript অবজেক্টগুলি this এর এই ব্যবহার থেকে বাদ দেওয়া হয়েছে। এই পরিস্থিতি এই জাভাস্ক্রিপ্ট কাঠামোর অনুরূপ ছিল:

// Rhino runtime

// Apps Script built-in services defined here, in the actual global context.
var SpreadsheetApp = {
  openById: function() { ... }
  getActive: function() { ... }
  // etc.
};

function() {
  // Implicit special context; all your code goes here. If the global this
  // is referenced in your code, it only contains elements from this context.

  // Any global variables you defined.
  var x = 42;

  // Your script functions.
  function myFunction() {
    ...
  }
  // End of your code.
}();

V8-এ, অন্তর্নিহিত বিশেষ প্রসঙ্গটি সরানো হয়েছে। স্ক্রিপ্টে সংজ্ঞায়িত গ্লোবাল ভেরিয়েবল এবং ফাংশনগুলি গ্লোবাল প্রসঙ্গ অনুসারে স্থাপন করা হয়েছে, বিল্ট-ইন অ্যাপস স্ক্রিপ্ট পরিষেবা এবং ECMAScript বিল্ট-ইন যেমন Math এবং Date এর পাশে।

আপনার স্ক্রিপ্টটি V8 তে স্থানান্তরিত করার সময়, বিশ্বব্যাপী প্রেক্ষাপটে this ব্যবহার সম্পর্কে আপনার কোডের প্রত্যাশা পরীক্ষা করুন এবং সামঞ্জস্য করুন। বেশিরভাগ ক্ষেত্রেই পার্থক্যগুলি কেবল তখনই স্পষ্ট হয় যখন আপনার কোড বিশ্বব্যাপী this বস্তুর কী বা সম্পত্তির নাম পরীক্ষা করে:

// Rhino runtime
var myGlobal = 5;

function myFunction() {

  // Only logs [myFunction, myGlobal];
  console.log(Object.keys(this));

  // Only logs [myFunction, myGlobal];
  console.log(
    Object.getOwnPropertyNames(this));
}





      
// V8 runtime
var myGlobal = 5;

function myFunction() {

  // Logs an array that includes the names
  // of Apps Script services
  // (CalendarApp, GmailApp, etc.) in
  // addition to myFunction and myGlobal.
  console.log(Object.keys(this));

  // Logs an array that includes the same
  // values as above, and also includes
  // ECMAScript built-ins like Math, Date,
  // and Object.
  console.log(
    Object.getOwnPropertyNames(this));
}

লাইব্রেরিতে instanceof এর হ্যান্ডলিং সামঞ্জস্য করুন

অন্য কোনও প্রকল্পের ফাংশনে প্যারামিটার হিসেবে পাস করা কোনও বস্তুর উপর লাইব্রেরিতে instanceof ব্যবহার করলে মিথ্যা নেতিবাচক ফলাফল পাওয়া যেতে পারে। V8 রানটাইমে, একটি প্রকল্প এবং এর লাইব্রেরিগুলি বিভিন্ন এক্সিকিউশন প্রসঙ্গে পরিচালিত হয় এবং তাই তাদের বিভিন্ন গ্লোবাল এবং প্রোটোটাইপ চেইন থাকে।

মনে রাখবেন যে এটি কেবল তখনই প্রযোজ্য যখন আপনার লাইব্রেরি এমন কোনও বস্তুতে instanceof ব্যবহার করে যা আপনার প্রকল্পে তৈরি করা হয়নি। আপনার প্রকল্পে তৈরি কোনও বস্তুতে এটি ব্যবহার করা, তা আপনার প্রকল্পের ভিতরে একই স্ক্রিপ্টে হোক বা ভিন্ন স্ক্রিপ্টে হোক, প্রত্যাশা অনুযায়ী কাজ করা উচিত।

যদি V8 তে চলমান কোনও প্রকল্প আপনার স্ক্রিপ্টটিকে লাইব্রেরি হিসেবে ব্যবহার করে, তাহলে আপনার স্ক্রিপ্টটি অন্য কোনও প্রকল্প থেকে পাস করা প্যারামিটারে instanceof ব্যবহার করে কিনা তা পরীক্ষা করুন। instanceof এর ব্যবহার সামঞ্জস্য করুন এবং আপনার ব্যবহারের ক্ষেত্রে অন্যান্য সম্ভাব্য বিকল্পগুলি ব্যবহার করুন।

a instanceof b এর জন্য একটি বিকল্প হল a এর কনস্ট্রাক্টর ব্যবহার করা যেখানে আপনাকে সম্পূর্ণ প্রোটোটাইপ চেইন অনুসন্ধান করতে হবে না এবং কেবল কনস্ট্রাক্টরটি পরীক্ষা করতে হবে। ব্যবহার: a.constructor.name == "b"

প্রকল্প A এবং প্রকল্প B বিবেচনা করুন যেখানে প্রকল্প A প্রকল্প B কে একটি লাইব্রেরি হিসেবে ব্যবহার করে।

//Rhino runtime

//Project A

function caller() {
   var date = new Date();
   // Returns true
   return B.callee(date);
}

//Project B

function callee(date) {
   // Returns true
   return(date instanceof Date);
}

      
//V8 runtime

//Project A

function caller() {
   var date = new Date();
   // Returns false
   return B.callee(date);
}

//Project B

function callee(date) {
   // Incorrectly returns false
   return(date instanceof Date);
   // Consider using return (date.constructor.name ==
   // Date) instead.
   // return (date.constructor.name == Date) -> Returns
   // true
}

আরেকটি বিকল্প হতে পারে এমন একটি ফাংশন চালু করা যা মূল প্রকল্পে instanceof পরীক্ষা করে এবং লাইব্রেরি ফাংশন কল করার সময় অন্যান্য প্যারামিটারের পাশাপাশি ফাংশনটি পাস করে। পাস করা ফাংশনটি লাইব্রেরির ভিতরে instanceof পরীক্ষা করতে ব্যবহার করা যেতে পারে।

//V8 runtime

//Project A

function caller() {
   var date = new Date();
   // Returns True
   return B.callee(date, date => date instanceof Date);
}

//Project B

function callee(date, checkInstanceOf) {
  // Returns True
  return checkInstanceOf(date);
}
      

লাইব্রেরিতে অ-ভাগ করা সম্পদের স্থানান্তর সামঞ্জস্য করুন

V8 রানটাইমে মূল স্ক্রিপ্ট থেকে একটি নন-শেয়ার্ড রিসোর্স লাইব্রেরিতে পাঠানো ভিন্নভাবে কাজ করে।

রাইনো রানটাইমে, শেয়ার না করা রিসোর্স পাস করা কাজ করবে না। এর পরিবর্তে লাইব্রেরি নিজস্ব রিসোর্স ব্যবহার করে।

V8 রানটাইমে, লাইব্রেরিতে একটি নন-শেয়ার্ড রিসোর্স পাস করা কাজ করে। লাইব্রেরিটি পাস করা নন-শেয়ার্ড রিসোর্স ব্যবহার করে।

ফাংশন প্যারামিটার হিসেবে নন-শেয়ার্ড রিসোর্স পাস করবেন না। সর্বদা নন-শেয়ার্ড রিসোর্স একই স্ক্রিপ্টে ঘোষণা করুন যেখানে এগুলো ব্যবহার করা হয়।

প্রকল্প A এবং প্রকল্প B বিবেচনা করুন যেখানে প্রকল্প A প্রকল্প B কে একটি লাইব্রেরি হিসেবে ব্যবহার করে। এই উদাহরণে, PropertiesService একটি অ-শেয়ারড রিসোর্স।

// Rhino runtime
// Project A
function testPassingNonSharedProperties() {
  PropertiesService.getScriptProperties()
      .setProperty('project', 'Project-A');
  B.setScriptProperties();
  // Prints: Project-B
  Logger.log(B.getScriptProperties(
      PropertiesService, 'project'));
}

//Project B function setScriptProperties() { PropertiesService.getScriptProperties() .setProperty('project', 'Project-B'); } function getScriptProperties( propertiesService, key) { return propertiesService.getScriptProperties() .getProperty(key); }

// V8 runtime
// Project A
function testPassingNonSharedProperties() {
  PropertiesService.getScriptProperties()
      .setProperty('project', 'Project-A');
  B.setScriptProperties();
  // Prints: Project-A
  Logger.log(B.getScriptProperties(
      PropertiesService, 'project'));
}

// Project B function setProperties() { PropertiesService.getScriptProperties() .setProperty('project', 'Project-B'); } function getScriptProperties( propertiesService, key) { return propertiesService.getScriptProperties() .getProperty(key); }

V8 রানটাইমে JDBC সুপারিশ

V8 রানটাইম সহ, আমরা JDBC পরিষেবাতে নতুন বৈশিষ্ট্য যুক্ত করেছি।

ব্যাচ অপারেশনের জন্য executeBatch ব্যবহার করুন

ব্যাচ ডাটাবেস অপারেশন সম্পাদনের জন্য আপনি executeBatch(params) অপারেশন ব্যবহার করতে পারেন।

নিম্নলিখিত উদাহরণে ব্যাচিং ব্যবহার করে একটি ডাটাবেসে একাধিক সারি সন্নিবেশ করানোর পদ্ধতি দেখানো হয়েছে:

এখানে রাইনো রানটাইম (পুরাতন পদ্ধতি) রয়েছে:

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.prepareStatement("INSERT INTO employees (name, age) VALUES (?, ?)");
var params = [["John Doe", 30], ["John Smith", 25]];
for (var i = 0; i < params.length; i++) {
  stmt.setString(1, params[i][0]);
  stmt.setInt(2, params[i][1]);
  stmt.execute();
}

এখানে V8 রানটাইম (নতুন পদ্ধতি) দেওয়া হল:

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.prepareStatement("INSERT INTO employees (name, age) VALUES (?, ?)");
var params = [["John Doe", 30], ["John Smith", 25]];
stmt.executeBatch(params);

ফলাফল সেট আনতে getRows ব্যবহার করুন

আপনি একটি কলে ফলাফল সেট ডেটা আনতে getRows(queryString) ব্যবহার করতে পারেন। queryStringJdbcResultSet এর getter পদ্ধতিতে কমা-বিচ্ছিন্ন কল থাকে, উদাহরণস্বরূপ: "getString(1), getDouble('price'), getDate(3, 'UTC')" । সমর্থিত পদ্ধতিতে সমস্ত getter পদ্ধতি অন্তর্ভুক্ত থাকে যা কলাম ডেটা পড়ার জন্য দায়ী, উদাহরণস্বরূপ, getHoldability , getMetaData ইত্যাদি সমর্থিত নয়। আর্গুমেন্টগুলি পূর্ণসংখ্যা কলাম সূচক (1-ভিত্তিক) অথবা একক বা দ্বিগুণ উদ্ধৃত স্ট্রিং কলাম লেবেল হতে পারে।

নিম্নলিখিত উদাহরণটি আপনাকে দেখায় কিভাবে ফলাফল সেট থেকে সারি আনতে হয়:

এখানে রাইনো রানটাইম (পুরাতন পদ্ধতি) রয়েছে:

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.createStatement();
var rs = stmt.executeQuery("SELECT name, age FROM employees");
while (rs.next()) {
  Logger.log(rs.getString('name') + ", " + rs.getInt('age'));
}

এখানে V8 রানটাইম (নতুন পদ্ধতি) দেওয়া হল:

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://...");
var stmt = conn.createStatement();
var rs = stmt.executeQuery("SELECT name, age FROM employees");
var rows = rs.getRows("getString('name'), getInt('age')");
for (var i = 0; i < rows.length; i++) {
  Logger.log(rows[i][0] + ", " + rows[i][1]);
}

স্বতন্ত্র স্ক্রিপ্টগুলিতে অ্যাক্সেস আপডেট করুন

V8 রানটাইমে চলমান স্বতন্ত্র স্ক্রিপ্টগুলির জন্য, স্ক্রিপ্টের ট্রিগারগুলি সঠিকভাবে কাজ করার জন্য আপনাকে ব্যবহারকারীদের কমপক্ষে স্ক্রিপ্টটিতে দেখার অ্যাক্সেস প্রদান করতে হবে।