উন্নত সংকলন

ওভারভিউ

ADVANCED_OPTIMIZATIONS এর একটি compilation_level সহ ক্লোজার কম্পাইলার ব্যবহার করা SIMPLE_OPTIMIZATIONS বা WHITESPACE_ONLY এর সাথে সংকলনের চেয়ে ভাল কম্প্রেশন রেট অফার করে। ADVANCED_OPTIMIZATIONS এর সাথে সংকলনটি কোডকে রূপান্তরিত করে এবং চিহ্নগুলির নাম পরিবর্তন করার উপায়ে আরও আক্রমণাত্মক হয়ে অতিরিক্ত কম্প্রেশন অর্জন করে। যাইহোক, এই আরও আক্রমনাত্মক পদ্ধতির মানে হল যে আউটপুট কোডটি ইনপুট কোডের মতো একইভাবে কাজ করে তা নিশ্চিত করতে আপনি যখন ADVANCED_OPTIMIZATIONS ব্যবহার করবেন তখন আপনাকে অবশ্যই আরও বেশি যত্ন নিতে হবে৷

এই টিউটোরিয়ালটি ADVANCED_OPTIMIZATIONS সংকলন স্তরটি কী করে এবং ADVANCED_OPTIMIZATIONS এর সাথে সংকলনের পরে আপনার কোড কাজ করে তা নিশ্চিত করতে আপনি কী করতে পারেন তা ব্যাখ্যা করে। এটি বাহ্যিক ধারণাটিও প্রবর্তন করে: একটি চিহ্ন যা কম্পাইলার দ্বারা প্রক্রিয়াকৃত কোডের বাইরের কোডে সংজ্ঞায়িত করা হয়।

এই টিউটোরিয়ালটি পড়ার আগে আপনাকে ক্লোজার কম্পাইলার টুল ( কম্পাইলার সার্ভিস UI , কম্পাইলার সার্ভিস API , বা কম্পাইলার অ্যাপ্লিকেশন ) এর সাথে জাভাস্ক্রিপ্ট কম্পাইল করার প্রক্রিয়ার সাথে পরিচিত হতে হবে।

পরিভাষার উপর একটি নোট: --compilation_level কমান্ড লাইন পতাকা ADVANCED_OPTIMIZATIONS SIMPLE_OPTIMIZATIONS ADVANCED SIMPLE করে। এই নথিটি দীর্ঘ ফর্ম ব্যবহার করে, তবে নামগুলি কমান্ড লাইনে বিনিময়যোগ্যভাবে ব্যবহার করা যেতে পারে।

  1. এমনকি আরও ভাল কম্প্রেশন
  2. কিভাবে ADVANCED_OPTIMIZATIONS সক্ষম করবেন
  3. ADVANCED_OPTIMIZATIONS ব্যবহার করার সময় কিসের দিকে খেয়াল রাখতে হবে
    1. আপনি রাখতে চান কোড অপসারণ
    2. অসামঞ্জস্যপূর্ণ সম্পত্তি নাম
    3. কোডের দুটি অংশ আলাদাভাবে কম্পাইল করা হচ্ছে
    4. কম্পাইলড এবং আনকম্পাইলড কোডের মধ্যে ভাঙ্গা রেফারেন্স

এমনকি আরও ভাল কম্প্রেশন

SIMPLE_OPTIMIZATIONS এর ডিফল্ট কম্পাইলেশন লেভেলের সাথে, ক্লোজার কম্পাইলার স্থানীয় ভেরিয়েবলের নাম পরিবর্তন করে জাভাস্ক্রিপ্টকে ছোট করে। স্থানীয় ভেরিয়েবল ব্যতীত অন্যান্য চিহ্ন রয়েছে যা সংক্ষিপ্ত করা যেতে পারে, তবে, এবং চিহ্নগুলির নাম পরিবর্তন করা ছাড়া কোড সঙ্কুচিত করার উপায় রয়েছে। ADVANCED_OPTIMIZATIONS এর সাথে সংকলন কোড-সঙ্কুচিত সম্ভাবনার সম্পূর্ণ পরিসরকে কাজে লাগায়।

নিম্নলিখিত কোডের জন্য SIMPLE_OPTIMIZATIONS এবং ADVANCED_OPTIMIZATIONS এর আউটপুট তুলনা করুন:

function unusedFunction(note) {
  alert(note['text']);
}

function displayNoteTitle(note) {
  alert(note['title']);
}

var flowerNote = {};
flowerNote['title'] = "Flowers";
displayNoteTitle(flowerNote);

SIMPLE_OPTIMIZATIONS এর সাথে সংকলন কোডটিকে এতে সংক্ষিপ্ত করে:

function unusedFunction(a){alert(a.text)}function displayNoteTitle(a){alert(a.title)}var flowerNote={};flowerNote.title="Flowers";displayNoteTitle(flowerNote);

ADVANCED_OPTIMIZATIONS এর সাথে সংকলন কোডটিকে সম্পূর্ণভাবে এতে সংক্ষিপ্ত করে:

alert("Flowers");

এই দুটি স্ক্রিপ্টই "Flowers" পড়ার একটি সতর্কতা তৈরি করে, কিন্তু দ্বিতীয় স্ক্রিপ্টটি অনেক ছোট।

ADVANCED_OPTIMIZATIONS স্তরটি বিভিন্ন উপায়ে পরিবর্তনশীল নামের সহজ সংক্ষিপ্তকরণের বাইরে যায়, যার মধ্যে রয়েছে:

  • আরও আক্রমণাত্মক নামকরণ:

    SIMPLE_OPTIMIZATIONS এর সাথে সংকলন শুধুমাত্র displayNoteTitle() এবং unusedFunction() ফাংশনের note প্যারামিটারের নাম পরিবর্তন করে, কারণ স্ক্রিপ্টের একমাত্র ভেরিয়েবল যেগুলি একটি ফাংশনের স্থানীয়। ADVANCED_OPTIMIZATIONS এছাড়াও গ্লোবাল ভেরিয়েবল flowerNote পরিবর্তন করে।

  • মৃত কোড অপসারণ:

    ADVANCED_OPTIMIZATIONS এর সাথে সংকলন unusedFunction() সম্পূর্ণরূপে সরিয়ে দেয়, কারণ এটিকে কখনই কোডে বলা হয় না।

  • ফাংশন ইনলাইনিং:

    ADVANCED_OPTIMIZATIONS এর সাথে সংকলন একক alert() displayNoteTitle() এর কলটিকে প্রতিস্থাপন করে যা ফাংশনের বডি কম্পোজ করে। ফাংশনের বডির সাথে ফাংশন কলের এই প্রতিস্থাপনকে "ইনলাইনিং" বলা হয়। যদি ফাংশনটি দীর্ঘ বা আরও জটিল হয় তবে এটিকে ইনলাইন করা কোডের আচরণ পরিবর্তন করতে পারে, কিন্তু ক্লোজার কম্পাইলার নির্ধারণ করে যে এই ক্ষেত্রে ইনলাইনিং নিরাপদ এবং স্থান সংরক্ষণ করে। ADVANCED_OPTIMIZATIONS এর সাথে সংকলন ইনলাইন ধ্রুবক এবং কিছু ভেরিয়েবল যখন এটি নির্ধারণ করে যে এটি নিরাপদে করতে পারে।

এই তালিকাটি আকার-হ্রাসকারী রূপান্তরের একটি নমুনা যা ADVANCED_OPTIMIZATIONS সংকলন সম্পাদন করতে পারে৷

কিভাবে ADVANCED_OPTIMIZATIONS সক্ষম করবেন

ক্লোজার কম্পাইলার পরিষেবা UI, পরিষেবা API, এবং অ্যাপ্লিকেশন সকলেরই compilation_level ADVANCED_OPTIMIZATIONS এ সেট করার জন্য বিভিন্ন পদ্ধতি রয়েছে।

ক্লোজার কম্পাইলার পরিষেবা UI-তে কীভাবে ADVANCED_OPTIMIZATIONS সক্ষম করবেন৷

ক্লোজার কম্পাইলার পরিষেবা UI-এর জন্য ADVANCED_OPTIMIZATIONS সক্ষম করতে, "উন্নত" রেডিও বোতামে ক্লিক করুন৷

ক্লোজার কম্পাইলার পরিষেবা API-তে কীভাবে ADVANCED_OPTIMIZATIONS সক্ষম করবেন৷

ক্লোজার কম্পাইলার পরিষেবা API-এর জন্য ADVANCED_OPTIMIZATIONS সক্ষম করতে, নিম্নলিখিত পাইথন প্রোগ্রামের মতো ADVANCED_OPTIMIZATIONS এর মান সহ compilation_level নামে একটি অনুরোধ প্যারামিটার অন্তর্ভুক্ত করুন:

#!/usr/bin/python2.4

import httplib, urllib, sys

params = urllib.urlencode([
    ('code_url', sys.argv[1]),
    ('compilation_level', 'ADVANCED_OPTIMIZATIONS'),
    ('output_format', 'text'),
    ('output_info', 'compiled_code'),
  ])

headers = { "Content-type": "application/x-www-form-urlencoded" }
conn = httplib.HTTPSConnection('closure-compiler.appspot.com')
conn.request('POST', '/compile', params, headers)
response = conn.getresponse()
data = response.read()
print data
conn.close()

ক্লোজার কম্পাইলার অ্যাপ্লিকেশনে কীভাবে ADVANCED_OPTIMIZATIONS সক্ষম করবেন

ক্লোজার কম্পাইলার অ্যাপ্লিকেশনের জন্য ADVANCED_OPTIMIZATIONS সক্ষম করতে, কমান্ড লাইন ফ্ল্যাগ --compilation_level ADVANCED_OPTIMIZATIONS অন্তর্ভুক্ত করুন, নিম্নোক্ত কমান্ডের মতো:

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js

ADVANCED_OPTIMIZATIONS ব্যবহার করার সময় কিসের দিকে খেয়াল রাখতে হবে

নীচে ADVANCED_OPTIMIZATIONS-এর কিছু সাধারণ অনিচ্ছাকৃত প্রভাব এবং সেগুলি এড়াতে আপনি যে পদক্ষেপগুলি নিতে পারেন তা তালিকাভুক্ত করা হয়েছে৷

আপনি রাখতে চান কোড অপসারণ

আপনি যদি ADVANCED_OPTIMIZATIONS এর সাথে নীচের ফাংশনটি কম্পাইল করেন তবে ক্লোজার কম্পাইলার খালি আউটপুট তৈরি করে:

function displayNoteTitle(note) {
  alert(note['myTitle']);
}

যেহেতু জাভাস্ক্রিপ্টে ফাংশনটি কখনই কল করা হয় না যা আপনি কম্পাইলারকে পাস করেন, ক্লোজার কম্পাইলার ধরে নেয় যে এই কোডটির প্রয়োজন নেই!

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

যাইহোক, যদি আপনি দেখতে পান যে ক্লোজার কম্পাইলার আপনি যে ফাংশনগুলি রাখতে চান তা সরিয়ে দিচ্ছে, এটি প্রতিরোধ করার দুটি উপায় রয়েছে:

  • ক্লোজার কম্পাইলার দ্বারা প্রক্রিয়াকৃত কোডে আপনার ফাংশন কলগুলি সরান৷
  • আপনি যে ফাংশনগুলি প্রকাশ করতে চান তার জন্য বহিরাগত অন্তর্ভুক্ত করুন।

পরবর্তী বিভাগগুলি প্রতিটি বিকল্পকে আরও বিশদে আলোচনা করে।

সমাধান: ক্লোজার কম্পাইলার দ্বারা প্রক্রিয়াকৃত কোডে আপনার ফাংশন কলগুলি সরান

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

এই সমস্যার সহজ সমাধান হল আপনার ফাংশনগুলিকে আপনার প্রোগ্রামের অংশের সাথে একত্রে কম্পাইল করা যা সেই ফাংশনগুলিকে কল করে। উদাহরণ স্বরূপ, ক্লোজার কম্পাইলার displayNoteTitle() কে মুছে ফেলবে না যখন এটি নিম্নলিখিত প্রোগ্রামটি কম্পাইল করে:

function displayNoteTitle(note) {
  alert(note['myTitle']);
}
displayNoteTitle({'myTitle': 'Flowers'});

displayNoteTitle() ফাংশনটি এই ক্ষেত্রে সরানো হয় না কারণ ক্লোজার কম্পাইলার দেখে যে এটি বলা হয়েছে।

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

সমাধান: আপনি যে ফাংশনগুলি প্রকাশ করতে চান তার জন্য Externs অন্তর্ভুক্ত করুন

এই সমাধান সম্পর্কে আরও তথ্য নীচে এবং বহিরাগত এবং রপ্তানি পৃষ্ঠায় দেওয়া হয়েছে৷

অসামঞ্জস্যপূর্ণ সম্পত্তি নাম

ক্লোজার কম্পাইলার কম্পাইলেশন কখনই আপনার কোডে স্ট্রিং লিটারেল পরিবর্তন করে না, আপনি যে কম্পাইলেশন লেভেল ব্যবহার করেন না কেন। এর অর্থ হল ADVANCED_OPTIMIZATIONS এর সাথে সংকলন বৈশিষ্ট্যগুলিকে আলাদাভাবে বিবেচনা করে আপনার কোড একটি স্ট্রিং দিয়ে সেগুলি অ্যাক্সেস করে কিনা তার উপর নির্ভর করে৷ আপনি যদি ডট-সিনট্যাক্স রেফারেন্সের সাথে একটি সম্পত্তির স্ট্রিং রেফারেন্স মিশ্রিত করেন, ক্লোজার কম্পাইলার সেই সম্পত্তির কিছু রেফারেন্সের নাম পরিবর্তন করে কিন্তু অন্যদের নয়। ফলস্বরূপ, আপনার কোড সম্ভবত সঠিকভাবে চালানো হবে না।

উদাহরণস্বরূপ, নিম্নলিখিত কোড নিন:

function displayNoteTitle(note) {
  alert(note['myTitle']);
}
var flowerNote = {};
flowerNote.myTitle = 'Flowers';

alert(flowerNote.myTitle);
displayNoteTitle(flowerNote);

এই সোর্স কোডের শেষ দুটি বিবৃতি ঠিক একই কাজ করে। যাইহোক, যখন আপনি ADVANCED_OPTIMIZATIONS দিয়ে কোডটি সংকুচিত করেন, তখন আপনি এটি পান:

var a={};a.a="Flowers";alert(a.a);alert(a.myTitle);

সংকুচিত কোডের শেষ বিবৃতিটি একটি ত্রুটি তৈরি করে। myTitle প্রপার্টির সরাসরি রেফারেন্সের নাম পরিবর্তন করে a করা হয়েছে, কিন্তু displayNoteTitle ফাংশনের মধ্যে myTitle এর উদ্ধৃত রেফারেন্সের নাম পরিবর্তন করা হয়নি। ফলস্বরূপ, শেষ বিবৃতিটি একটি myTitle সম্পত্তিকে নির্দেশ করে যা আর নেই।

সমাধান: আপনার সম্পত্তির নামের সাথে সামঞ্জস্যপূর্ণ থাকুন

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

এছাড়াও, যখন সম্ভব, ডট-সিনট্যাক্স ব্যবহার করতে পছন্দ করুন, কারণ এটি আরও ভাল চেক এবং অপ্টিমাইজেশন সমর্থন করে। উদ্ধৃত স্ট্রিং সম্পত্তি অ্যাক্সেস শুধুমাত্র তখনই ব্যবহার করুন যখন আপনি ক্লোজার কম্পাইলার নাম পরিবর্তন করতে চান না, যেমন যখন নামটি বাইরের উৎস থেকে আসে, যেমন ডিকোডেড JSON।

কোডের দুটি অংশ আলাদাভাবে কম্পাইল করা হচ্ছে

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

উদাহরণস্বরূপ, অনুমান করুন যে একটি অ্যাপ্লিকেশন দুটি ভাগে বিভক্ত: একটি অংশ যা ডেটা পুনরুদ্ধার করে এবং একটি অংশ যা ডেটা প্রদর্শন করে।

ডেটা পুনরুদ্ধারের জন্য এখানে কোড:

function getData() {
  // In an actual project, this data would be retrieved from the server.
  return {title: 'Flower Care', text: 'Flowers need water.'};
}

এখানে তথ্য প্রদর্শনের জন্য কোড আছে:

var displayElement = document.getElementById('display');
function displayData(parent, data) {
  var textElement = document.createTextNode(data.text);
  parent.appendChild(textElement);
}
displayData(displayElement, getData());

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

input:6: ERROR - variable getData is undefined
displayData(displayElement, getData());

যেহেতু কম্পাইলারের getData() ফাংশনে অ্যাক্সেস থাকে না যখন এটি কোডটি কম্পাইল করে যা ডেটা প্রদর্শন করে, এটি getData কে অনির্ধারিত হিসাবে বিবেচনা করে।

সমাধান: একটি পৃষ্ঠার জন্য সমস্ত কোড একসাথে কম্পাইল করুন

সঠিক সংকলন নিশ্চিত করতে, একটি একক সংকলন রানে একটি পৃষ্ঠার জন্য সমস্ত কোড একসাথে কম্পাইল করুন। ক্লোজার কম্পাইলার একাধিক জাভাস্ক্রিপ্ট ফাইল এবং জাভাস্ক্রিপ্ট স্ট্রিংগুলিকে ইনপুট হিসাবে গ্রহণ করতে পারে, যাতে আপনি একটি একক সংকলন অনুরোধে লাইব্রেরি কোড এবং অন্যান্য কোড একসাথে পাস করতে পারেন।

দ্রষ্টব্য: এই পদ্ধতিটি কাজ করবে না যদি আপনাকে কম্পাইল করা এবং আনকম্পাইল করা কোড মিশ্রিত করতে হয়। এই পরিস্থিতি পরিচালনার টিপসের জন্য কম্পাইলড এবং আনকম্পাইলড কোডের মধ্যে ভাঙা রেফারেন্স দেখুন।

কম্পাইলড এবং আনকম্পাইলড কোডের মধ্যে ভাঙ্গা রেফারেন্স

ADVANCED_OPTIMIZATIONS এ চিহ্ন পুনঃনামকরণ ক্লোজার কম্পাইলার দ্বারা প্রক্রিয়াকৃত কোড এবং অন্য কোন কোডের মধ্যে যোগাযোগ বিচ্ছিন্ন করবে। কম্পাইলেশন আপনার সোর্স কোডে সংজ্ঞায়িত ফাংশনগুলির নাম পরিবর্তন করে। আপনার ফাংশনগুলিকে কল করে এমন কোনও বাহ্যিক কোড আপনি কম্পাইল করার পরে ভেঙে যাবে, কারণ এটি এখনও পুরানো ফাংশন নামকে বোঝায়। একইভাবে, বাহ্যিকভাবে সংজ্ঞায়িত চিহ্নের সংকলিত কোডের রেফারেন্স ক্লোজার কম্পাইলার দ্বারা পরিবর্তিত হতে পারে।

মনে রাখবেন যে "uncompiled কোড" একটি স্ট্রিং হিসাবে eval() ফাংশনে পাস করা যেকোনো কোড অন্তর্ভুক্ত করে। ক্লোজার কম্পাইলার কখনই কোডে স্ট্রিং লিটারেল পরিবর্তন করে না, তাই ক্লোজার কম্পাইলার eval() স্টেটমেন্টে পাস করা স্ট্রিং পরিবর্তন করে না।

সচেতন থাকুন যে এগুলি সম্পর্কিত কিন্তু স্বতন্ত্র সমস্যা: সংকলিত-থেকে-বাহ্যিক যোগাযোগ বজায় রাখা, এবং বহিরাগত-থেকে-সংকলিত যোগাযোগ বজায় রাখা। এই পৃথক সমস্যাগুলির একটি সাধারণ সমাধান রয়েছে, তবে প্রতিটি দিকেই সূক্ষ্মতা রয়েছে। ক্লোজার কম্পাইলার থেকে সবচেয়ে বেশি সুবিধা পেতে আপনার কোন কেস আছে তা বোঝা গুরুত্বপূর্ণ।

চালিয়ে যাওয়ার আগে, আপনি বহিরাগত এবং রপ্তানির সাথে নিজেকে পরিচিত করতে চাইতে পারেন।

কম্পাইল করা কোড থেকে এক্সটার্নাল কোডে কল করার সমাধান: এক্সটার্নের সাথে কম্পাইল করা

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

এর সাধারণ উদাহরণ হল APIs যেমন OpenSocial API এবং Google Maps API । উদাহরণস্বরূপ, যদি আপনার কোডটি OpenSocial ফাংশনকে কল করে opensocial.newDataRequest() , উপযুক্ত বহিঃপ্রকাশ ছাড়া, ক্লোজার কম্পাইলার এই কলটিকে ab() রূপান্তরিত করবে।

এক্সটার্নাল কোড থেকে কম্পাইল করা কোডে কল করার সমাধান: এক্সটার্ন্স বাস্তবায়ন করা

আপনার যদি জাভাস্ক্রিপ্ট কোড থাকে যা আপনি একটি লাইব্রেরি হিসাবে পুনঃব্যবহার করেন, তাহলে আপনি ক্লোজার কম্পাইলার ব্যবহার করতে চাইতে পারেন শুধুমাত্র লাইব্রেরীকে সঙ্কুচিত করতে যখন এখনও লাইব্রেরিতে অসংকলিত কোডকে ফাংশন কল করার অনুমতি দেয়।

এই পরিস্থিতিতে সমাধান হল আপনার লাইব্রেরির পাবলিক API সংজ্ঞায়িত করে এক্সটার্নের একটি সেট বাস্তবায়ন করা। আপনার কোড এই বহিরাগত ঘোষিত চিহ্নগুলির জন্য সংজ্ঞা সরবরাহ করবে। এর মানে আপনার বহিরাগত উল্লেখ করা কোনো ক্লাস বা ফাংশন। এর অর্থ হতে পারে আপনার ক্লাসগুলি এক্সটার্নে ঘোষিত ইন্টারফেসগুলি প্রয়োগ করা।

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

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

এখানে একটি গুরুত্বপূর্ণ সতর্কতা হল যে আপনি বহিরাগত প্রতীক সংজ্ঞায়িত কোড সম্পর্কে "ডুপ্লিকেট সংজ্ঞা" ডায়গনিস্টিক পেতে পারেন। ক্লোজার কম্পাইলার অনুমান করে যে এক্সটার্নের কোনো চিহ্ন বাইরের লাইব্রেরি দ্বারা সরবরাহ করা হচ্ছে, এবং বর্তমানে আপনি ইচ্ছাকৃতভাবে একটি সংজ্ঞা সরবরাহ করছেন তা বুঝতে পারবেন না। এই ডায়াগনস্টিকগুলি দমন করা নিরাপদ, এবং আপনি দমনকে একটি নিশ্চিতকরণ হিসাবে ভাবতে পারেন যে আপনি সত্যিই আপনার API পূরণ করছেন৷

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