বহিরাগত এবং রপ্তানি

বহিরাগতদের উদ্দেশ্য

Externs হল ঘোষণা যা ক্লোজার কম্পাইলারকে চিহ্নগুলির নাম বলে যেগুলি উন্নত সংকলনের সময় পুনরায় নামকরণ করা উচিত নয়। এগুলিকে বহিরাগত বলা হয় কারণ এই চিহ্নগুলি প্রায়শই সংকলনের বাইরের কোড দ্বারা সংজ্ঞায়িত করা হয়, যেমন একটি নেটিভ কোড, বা তৃতীয় পক্ষের লাইব্রেরি। এই কারণে, বহিরাগতগুলিতে প্রায়শই টাইপ টীকাও থাকে, যাতে ক্লোজার কম্পাইলার আপনার সেই চিহ্নগুলির ব্যবহার টাইপ চেক করতে পারে।

সাধারণভাবে, সংকলিত কোডের কিছু অংশ বাস্তবায়নকারী এবং ভোক্তাদের মধ্যে একটি API চুক্তি হিসাবে externs কে ভাবা ভাল। এক্সটার্নগুলি সংজ্ঞায়িত করে যে বাস্তবায়নকারী কী সরবরাহ করার প্রতিশ্রুতি দেয় এবং ভোক্তারা কী ব্যবহার করার উপর নির্ভর করতে পারে। উভয় পক্ষের চুক্তির একটি অনুলিপি প্রয়োজন।

Externs অন্যান্য ভাষার হেডার ফাইলের মতই।

বাহ্যিক সিনট্যাক্স

Externs হল এমন ফাইল যা দেখতে অনেকটা সাধারণ জাভাস্ক্রিপ্টের মতই ক্লোজার কম্পাইলারের জন্য টীকা করা। প্রধান পার্থক্য হল যে তাদের বিষয়বস্তু সংকলিত আউটপুট অংশ হিসাবে মুদ্রিত হয় না, তাই মানগুলির কোনটিই অর্থপূর্ণ নয়, শুধুমাত্র নাম এবং প্রকারগুলি।

নীচে একটি সাধারণ লাইব্রেরির জন্য একটি externs ফাইলের একটি উদাহরণ।

// The `@externs` annotation is the best way to indicate a file contains externs.

/**
 * @fileoverview Public API of my_math.js.
 * @externs
 */

// Externs often declare global namespaces.

const myMath = {};

// Externs can declare functions, most importantly their names.

/**
 * @param {number} x
 * @param {number} y
 * @return {!myMath.DivResult}
 */
myMath.div = function(x, y) {};  // Note the empty body.

// Externs can contain type declarations, such as classes and interfaces.

/** The result of an integer division. */
myMath.DivResult = class {

  // Constructors are special; member fields can be declared in their bodies.

  constructor() {
    /** @type {number} */
    this.quotient;
    /** @type {number} */
    this.remainder;
  }

  // Methods can be declared as usual; their bodies are meaningless though.

  /** @return {!Array<number>} */
  toPair() {}

};

// Fields and methods can also be declared using prototype notation.

/**
 * @override
 * @param {number=} radix
 */
myMath.DivResult.prototype.toString = function(radix) {};
    

--externs পতাকা

সাধারণত, @externs টীকা হল কম্পাইলারকে জানানোর সর্বোত্তম উপায় যে একটি ফাইলে externs রয়েছে। এই ধরনের ফাইলগুলিকে --js কমান্ড-লাইন পতাকা ব্যবহার করে সাধারণ সোর্স ফাইল হিসাবে অন্তর্ভুক্ত করা যেতে পারে,

যাইহোক, externs ফাইলগুলি নির্দিষ্ট করার জন্য আরেকটি, পুরানো উপায় আছে। --externs কমান্ড-লাইন পতাকা externs ফাইলগুলি স্পষ্টভাবে পাস করতে ব্যবহার করা যেতে পারে। এই পদ্ধতি সুপারিশ করা হয় না.

Externs ব্যবহার করে

উপর থেকে externs নিম্নলিখিত হিসাবে গ্রাস করা যেতে পারে.

/**
 * @fileoverview Do some math.
 */

/**
 * @param {number} x
 * @param {number} y
 * @return {number}
 */
export function greatestCommonDivisor(x, y) {
  while (y != 0) {
    const temp = y;
    // `myMath` is a global, it and `myMath.div` are never renamed.
    const result = myMath.div(x, y);
    // `remainder` is also never renamed on instances of `DivResult`.
    y = result.remainder;
    x = temp;
  }
  return x;
}
    

ক্লোজার কম্পাইলার সার্ভিস এপিআই এর সাথে এক্সটার্নস কিভাবে অন্তর্ভুক্ত করবেন

ক্লোজার কম্পাইলার অ্যাপ্লিকেশন এবং ক্লোজার কম্পাইলার পরিষেবা API উভয়ই বহিরাগত ঘোষণার অনুমতি দেয়। যাইহোক, ক্লোজার কম্পাইলার পরিষেবা UI এক্সটার্ন ফাইলগুলি নির্দিষ্ট করার জন্য একটি ইন্টারফেস উপাদান প্রদান করে না।

ক্লোজার কম্পাইলার পরিষেবাতে একটি বহিরাগত ঘোষণা পাঠানোর তিনটি উপায় রয়েছে:

  • একটি উৎস ফাইল হিসাবে @externs টীকা ধারণকারী একটি ফাইল পাস করুন।
  • js_externs প্যারামিটারে ক্লোজার কম্পাইলার পরিষেবাতে জাভাস্ক্রিপ্ট পাস করুন।
  • externs_url প্যারামিটারে ক্লোজার কম্পাইলার পরিষেবাতে একটি জাভাস্ক্রিপ্ট ফাইলের URL পাস করুন।

externs_url ব্যবহার করা এবং js_externs ব্যবহার করার মধ্যে একমাত্র পার্থক্য হল কিভাবে জাভাস্ক্রিপ্ট ক্লোজার কম্পাইলার পরিষেবাতে যোগাযোগ করা হয়।

রপ্তানির উদ্দেশ্য

রপ্তানি হল সংকলনের পরে প্রতীকগুলির সামঞ্জস্যপূর্ণ নাম দেওয়ার আরেকটি পদ্ধতি। তারা বহিরাগতদের তুলনায় কম দরকারী এবং প্রায়ই বিভ্রান্তিকর। সাধারণ ব্যতীত সব ক্ষেত্রেই এড়িয়ে যাওয়া হয়।

রপ্তানি এই সত্যের উপর নির্ভর করে যে ক্লোজার কম্পাইলার স্ট্রিং লিটারেল পরিবর্তন করে না। একটি আক্ষরিক ব্যবহার করে একটি প্রপার্টি নামক একটি বস্তু বরাদ্দ করে, বস্তুটি সংকলনের পরেও সেই সম্পত্তি নামের মাধ্যমে পাওয়া যাবে।

নীচে একটি সহজ উদাহরণ.

/**
 * @fileoverview Do some math.
 */

// Note that the concept of module exports is totally unrelated.

/** @return {number} */
export function myFunction() {
  return 5;
}

// This assignment ensures `myFunctionAlias` will be a global alias exposing `myFunction`,
// even after compilation.

window['myFunctionAlias'] = myFunction;
    

আপনি যদি ক্লোজার লাইব্রেরি ব্যবহার করেন, তাহলে goog.exportSymbol এবং goog.exportProperty ফাংশন ব্যবহার করেও রপ্তানি ঘোষণা করা যেতে পারে।

এই ফাংশনগুলির ক্লোজার লাইব্রেরি ডকুমেন্টেশনে আরও তথ্য পাওয়া যায়। যাইহোক, সচেতন থাকুন তাদের বিশেষ কম্পাইলার সমর্থন রয়েছে এবং কম্পাইল করা আউটপুটে সম্পূর্ণরূপে রূপান্তরিত হবে।

রপ্তানি সঙ্গে সমস্যা

রপ্তানিগুলি বহিরাগতদের থেকে আলাদা যে তারা শুধুমাত্র ভোক্তাদের রেফারেন্সের জন্য একটি উন্মুক্ত উপনাম তৈরি করে৷ সংকলিত কোডের মধ্যে, রপ্তানি করা প্রতীকটির নাম পরিবর্তন করা হবে। এই কারণে, রপ্তানি করা প্রতীকগুলি অবশ্যই ধ্রুবক হতে হবে, যেহেতু আপনার কোডে সেগুলিকে পুনরায় বরাদ্দ করার ফলে উন্মুক্ত উপনামটি ভুল জিনিসের দিকে নির্দেশ করবে৷

পুনঃনামকরণের এই সূক্ষ্মতা রপ্তানি করা উদাহরণ বৈশিষ্ট্যের ক্ষেত্রে বিশেষত জটিল।

তাত্ত্বিকভাবে, রপ্তানি এক্সটার্নের তুলনায় ছোট কোড-আকারের অনুমতি দিতে পারে, যেহেতু দীর্ঘ নামগুলি এখনও আপনার কোডের মধ্যে ছোট নামগুলিতে পরিবর্তন করা যেতে পারে। অনুশীলনে, এই উন্নতিগুলি প্রায়শই খুব ছোট হয়, এবং রপ্তানি যে বিভ্রান্তি তৈরি করে তা সমর্থন করে না।

রপ্তানিও ভোক্তাদের জন্য বহিরাগতদের মত অনুসরণ করার জন্য একটি API প্রদান করে না। রপ্তানির তুলনায়, বহিরাগতগুলি আপনি যে চিহ্নগুলি প্রকাশ করতে চান, সেগুলির প্রকারগুলি নথিভুক্ত করে এবং আপনাকে ব্যবহারের তথ্য যোগ করার জন্য একটি জায়গা দেয়৷ অতিরিক্তভাবে, যদি আপনার ভোক্তারাও ক্লোজার কম্পাইলার ব্যবহার করে থাকেন, তাহলে তাদের কম্পাইল করার জন্য এক্সটার্নের প্রয়োজন হবে।