खास जानकारी
ADVANCED_OPTIMIZATIONS
के compilation_level
के साथ क्लोज़र कंपाइलर का इस्तेमाल करने से, SIMPLE_OPTIMIZATIONS
या WHITESPACE_ONLY
के साथ कंपाइलेशन करने के मुकाबले, कंप्रेस करने की बेहतर दर मिलती है. ADVANCED_OPTIMIZATIONS
के साथ कंपाइल करने पर कोड में बदलाव करने और सिंबल का नाम बदलने के तरीके को ज़्यादा सख्त
बनाकर अतिरिक्त कंप्रेशन किया जाता है. हालांकि, इस तरीके का इस्तेमाल करने पर, आपको ADVANCED_OPTIMIZATIONS
का इस्तेमाल करते समय ज़्यादा ध्यान रखना होगा. इससे, यह पक्का होगा कि आउटपुट कोड, इनपुट कोड की तरह ही काम करता है.
इस ट्यूटोरियल में बताया गया है कि ADVANCED_OPTIMIZATIONS
कंपाइलेशन लेवल क्या करता है और ADVANCED_OPTIMIZATIONS
के साथ कंपाइल करने के बाद, आपका कोड कैसे काम करे, यह पक्का करने के लिए क्या किया जा सकता है. यहां बाहरी सिद्धांत को भी दिखाया गया है. यह ऐसा कोड है जिसे कंपाइलर से प्रोसेस किए जाने वाले कोड के बाहर, कोड में बताया जाता है.
इस ट्यूटोरियल को पढ़ने से पहले आपको क्लोज़र कंपाइलर टूल (कंपाइलर सेवा यूज़र इंटरफ़ेस (यूआई), कंपाइलर सेवा एपीआई या कंपाइलर ऐप्लिकेशन) से JavaScript कंपाइल करने की प्रोसेस से परिचित होना चाहिए.
शब्दावली से जुड़ी अहम जानकारी: --compilation_level
कमांड लाइन फ़्लैग,
ADVANCED
और
SIMPLE
जैसे आम तौर पर इस्तेमाल होने वाले शॉर्ट फ़ॉर्म के साथ-साथ
ADVANCED_OPTIMIZATIONS
और SIMPLE_OPTIMIZATIONS
का इस्तेमाल करता है.
इस दस्तावेज़ में लंबे फ़ॉर्म का इस्तेमाल होता है, लेकिन कमांड लाइन पर नामों का इस्तेमाल एक-दूसरे की जगह पर किया जा सकता है.
- यहां तक कि बेहतर कंप्रेसिंग
- advanced_OPTIMIZATIONS कैसे चालू करें
- ऐडवांस्ड_OPTIMIZATIONS का इस्तेमाल करते समय किन बातों का ध्यान रखना चाहिए
और भी ज़्यादा कंप्रेस करें
SIMPLE_OPTIMIZATIONS
के डिफ़ॉल्ट कंपाइलेशन लेवल के साथ, क्लोज़र कंपाइलर लोकल वैरिएबल का नाम बदलकर
JavaScript को छोटा बनाता है. हालांकि, लोकल वैरिएबल के अलावा ऐसे अन्य सिंबल भी होते हैं जिन्हें छोटा किया जा सकता है. हालांकि, सिंबल का नाम बदलने के अलावा, कोड को छोटा करने के भी कई तरीके हैं. 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
के साथ जोड़कर,displayNoteTitle()
के कॉल को फ़ंक्शन के मुख्य हिस्से में शामिलalert()
से बदल दिया जाता है. इस फ़ंक्शन को फ़ंक्शन के मुख्य भाग से बदलने की प्रक्रिया को "इनलाइन करना" कहा जाता है. अगर फ़ंक्शन लंबा था या ज़्यादा मुश्किल था, तो उसे इनलाइन करने से कोड का व्यवहार बदल सकता है, लेकिन क्लोज़र कंपाइलर यह तय करता है कि इस मामले में इनलाइनिंग सुरक्षित है और जगह बचाती है.ADVANCED_OPTIMIZATIONS
के साथ कंपाइल करने पर, कॉन्सटेंट और कुछ वैरिएबल भी इनलाइन हो जाते हैं. ऐसा तब होता है, जब यह तय हो जाता है कि ऐसा किया जा सकता है.
यह सूची आकार में कमी लाने वाले बदलावों का बस एक नमूना है
जो ADVANCED_OPTIMIZATIONS
कंपाइलेशन कर सकता है.
advanced_OPTIMIZATIONS कैसे सक्षम करें
Cloशनर कंपाइलर सेवा यूज़र इंटरफ़ेस (यूआई), सेवा एपीआई, और ऐप्लिकेशन
सभी को
compilation_level
को ADVANCED_OPTIMIZATIONS
पर सेट करने के अलग-अलग तरीके हैं.
Closure कंपाइलर सेवा यूज़र इंटरफ़ेस (यूआई) में advanced_OPTIMIZATIONS चालू करने का तरीका
क्लोज़र कंपाइलर सेवा यूज़र इंटरफ़ेस (यूआई) के लिए ADVANCED_OPTIMIZATIONS
को चालू करने के लिए, "बेहतर" रेडियो बटन पर क्लिक करें.
क्लोज़र कंपाइलर सेवा एपीआई में ADVANCED_OPTIMIZATIONS
को चालू करने का तरीका
ADVANCED_OPTIMIZATIONS
को बंद करने के लिए, कंपाइलर सेवा एपीआई को चालू करने के लिए, compilation_level
नाम का अनुरोध पैरामीटर शामिल करें, जिसमें ADVANCED_OPTIMIZATIONS
की वैल्यू का इस्तेमाल करें, जैसा कि इस Python प्रोग्राम में किया गया है:
#!/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
सेटअप_बेहतर बनाने के दौरान किन चीज़ों का इस्तेमाल करना ज़रूरी है
नीचे बेहतर_OPTIMIZATIONS के कुछ आम अनचाहे प्रभाव दिए गए हैं और उनसे बचने के तरीके बताए गए हैं.
वह कोड हटाना जिसे आपको रखना है
अगर आप ADVANCED_OPTIMIZATIONS
के साथ सिर्फ़ नीचे दिए गए फ़ंक्शन को कंपाइल करते हैं, तो क्लोज़र कंपाइलर खाली आउटपुट देता है:
function displayNoteTitle(note) { alert(note['myTitle']); }
इसलिए, JavaScript में उस फ़ंक्शन को कभी भी कॉल नहीं किया जाता है जिसे आपने कंपाइलर को पास किया हो, Closure कंपाइलर यह मानता है कि इस कोड की ज़रूरत नहीं है!
कई मामलों में, ऐसा ही होता है, जैसा आप चाहते हैं. उदाहरण के लिए, अगर आपको अपने कोड को किसी बड़ी लाइब्रेरी के साथ कंपाइल करना है, तो क्लोसर कंपाइलर इस बात का पता लगा सकता है कि उस लाइब्रेरी के किन फ़ंक्शन को इस्तेमाल किया जा रहा है और किनका नहीं.
हालांकि, अगर आपको यह पता चलता है कि क्लोज़र कंपाइलर ऐसे फ़ंक्शन हटा रहा है जिन्हें आप रखना चाहते हैं, तो इसे दो तरीकों से रोका जा सकता है:
- अपने फ़ंक्शन कॉल को क्लोज़र कंपाइलर के ज़रिए प्रोसेस किए गए कोड में ले जाएं.
- जिन फ़ंक्शन को आप बिना अनुमति के सार्वजनिक करना चाहते हैं उनके लिए एक्सटेंशन शामिल करें.
अगले सेक्शन में, हर विकल्प के बारे में ज़्यादा जानकारी दी गई है.
समाधान: अपने फ़ंक्शन कॉल को क्लोज़र कंपाइलर से प्रोसेस किए गए कोड में ले जाना
अपने कोड के कुछ हिस्सों को क्लोज़र कंपाइलर से कंपाइल करने पर, आपको अनचाही प्रॉपर्टी हटाने का मैसेज मिल सकता है. उदाहरण के लिए, आपके पास कोई लाइब्रेरी फ़ाइल हो सकती है
जिसमें सिर्फ़ फ़ंक्शन की परिभाषाएं शामिल हों. साथ ही, एक ऐसी एचटीएमएल फ़ाइल जिसमें
लाइब्रेरी शामिल हो और उसमें ऐसे फ़ंक्शन को कॉल करने वाला कोड मौजूद हो. इस मामले में, अगर ADVANCED_OPTIMIZATIONS
के साथ लाइब्रेरी फ़ाइल को कंपाइल किया जाता है, तो Closure कंपाइलर आपकी सभी लाइब्रेरी फ़ंक्शन को हटा देता है.
इस समस्या का सबसे आसान हल, अपने प्रोग्राम के उस हिस्से के साथ फ़ंक्शन को एक साथ जोड़ना है जो उन फ़ंक्शन को कॉल करता है.
उदाहरण के लिए, जब क्लोज़र कंपाइलर नीचे दिए गए प्रोग्राम को कंपाइल करता है, तब displayNoteTitle()
को नहीं हटाएगा:
function displayNoteTitle(note) { alert(note['myTitle']); } displayNoteTitle({'myTitle': 'Flowers'});
इस मामले में, displayNoteTitle()
फ़ंक्शन नहीं हटाया गया, क्योंकि क्लोज़र कंपाइलर को जानकारी मिली है.
दूसरे शब्दों में, आप अनचाहे कोड को हटाने से बच सकते हैं. इसके लिए, आपको अपने प्रोग्राम में एंट्रेंस पॉइंट को उस कोड में शामिल करना होगा जिसे आपने क्लोज़र कंपाइलर को पास किया था. प्रोग्राम का एंट्री पॉइंट, कोड में वह जगह होती है जहां प्रोग्राम चलना शुरू होता है. उदाहरण के लिए, पिछले सेक्शन में दिए गए फूलों के नोट प्रोग्राम में, ब्राउज़र में JavaScript लोड होते ही, आखिरी तीन लाइनें चलती हैं. यह इस प्रोग्राम के लिए एंट्री पॉइंट है. यह तय करने के लिए कि आपको कौन सा कोड रखना चाहिए, क्लोज़र कंपाइलर इस प्रवेश बिंदु से शुरू होता है और वहां से आगे कार्यक्रम के कंट्रोल फ़्लो का पता लगाता है.
समाधान: उन फ़ंक्शन के लिए एक्सटेंशन शामिल करें जिन्हें आपको दिखाना है
इस समाधान के बारे में ज़्यादा जानकारी नीचे दी गई है. साथ ही, एक्सटर्नल और एक्सपोर्ट पेज पर दी गई है.
प्रॉपर्टी के नाम एक जैसे नहीं हैं
क्लोज़र कंपाइलर कंपाइल आपके कोड में स्ट्रिंग लिटरल को कभी नहीं बदलता है, इस बात से कोई फ़र्क़ नहीं पड़ता कि आप किस कंपाइलेशन लेवल का इस्तेमाल करते हैं. इसका मतलब है कि ADVANCED_OPTIMIZATIONS
के साथ जोड़कर प्रॉपर्टी,
अलग-अलग प्रॉपर्टी का इस्तेमाल करेगी. यह इस बात पर निर्भर करता है कि कोड उन्हें स्ट्रिंग के साथ ऐक्सेस करता है या नहीं. अगर आप किसी ऐसी प्रॉपर्टी के स्ट्रिंग रेफ़रंस को शामिल करते हैं जिनमें डॉट-सिंटैक्स रेफ़रंस शामिल हैं, तो Closure कंपाइलर
उस प्रॉपर्टी के कुछ रेफ़रंस के नाम बदल देता है, लेकिन दूसरों के नहीं. इस वजह से, शायद आपका कोड ठीक से नहीं चलेगा.
उदाहरण के लिए, यह कोड लें:
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()
फ़ंक्शन को हटा देता है. दूसरा,
Closure कंपाइलर डेटा दिखाने वाले कोड को प्रोसेस करते समय गंभीर गड़बड़ी पैदा करता है.
input:6: ERROR - variable getData is undefined displayData(displayElement, getData());
कंपाइलर के पास, getData()
फ़ंक्शन का ऐक्सेस नहीं होता है, क्योंकि यह डेटा दिखाने वाले कोड को कंपाइल करता है. इसलिए, यह getData
को तय नहीं करता है.
समाधान: एक साथ किसी पेज के लिए सभी कोड इकट्ठा करना
सही कंपाइलेशन पक्का करने के लिए, एक पेज पर सभी कोड को एक साथ कंपाइल करें. क्लोज़र कंपाइलर इनपुट के तौर पर कई JavaScript फ़ाइलें और JavaScript स्ट्रिंग स्वीकार कर सकता है, ताकि आप एक ही कंपाइलेशन अनुरोध में लाइब्रेरी का कोड और अन्य कोड एक साथ पास कर सकें.
ध्यान दें: अगर आपको कंपाइल किए गए और बिना कंपाइल किए गए कोड को जोड़ना है, तो यह तरीका काम नहीं करेगा. इस समस्या को ठीक करने से जुड़ी सलाह पाने के लिए, कंपाइल किए गए और बिना कोड वाले कोड के बीच के टूटे हुए रेफ़रंस देखें.
कंपाइल किए गए और बिना कंपाइल किए गए कोड के बीच में टूटे हुए रेफ़रंस
ADVANCED_OPTIMIZATIONS
में नाम बदलने का निशान, Cloसर कंपाइलर और किसी भी दूसरे कोड के ज़रिए प्रोसेस किए गए कोड के बीच
कम्यूनिकेशन को तोड़ देगा. कंपाइलेशन आपके सोर्स कोड में बताए गए फ़ंक्शन का नाम
बदलता है. जब आप कंपाइल करते हैं, तो आपके फ़ंक्शन को कॉल करने वाला कोई भी बाहरी कोड काम नहीं करेगा, क्योंकि यह अब भी पुराने फ़ंक्शन के नाम के बारे में बताता है. इसी तरह, बाहरी रूप से तय किए गए सिंबल के लिए कंपाइल किए गए कोड में मौजूद रेफ़रंस, क्लोज़र कंपाइलर में बदले जा सकते हैं.
ध्यान रखें कि "कंपाइल नहीं किया गया कोड" में eval()
फ़ंक्शन को, स्ट्रिंग के तौर पर दिया गया कोई भी कोड शामिल होता है. क्लोज़र कंपाइलर कोड में स्ट्रिंग लिटरल को कभी नहीं बदलता है, इसलिए क्लोज़र कंपाइलर eval()
स्टेटमेंट में पास की गई स्ट्रिंग में कोई बदलाव नहीं करता.
ध्यान रखें कि ये एक-दूसरे से जुड़ी हैं, लेकिन अलग-अलग हैं: कंपाइल की गई और एक्सटर्नल कम्यूनिकेशन को बनाए रखना और बाहरी से कंपाइल की गई बातचीत को बनाए रखना. इन अलग-अलग समस्याओं में एक आम समाधान होता है, लेकिन दोनों पक्षों में बारीकियां होती हैं. Closure कंपाइलर का ज़्यादा से ज़्यादा फ़ायदा लेने के लिए, यह समझना ज़रूरी है कि आपके पास कौनसा केस है.
आगे बढ़ने से पहले, यह हो सकता है कि आप बाहरी चीज़ों और एक्सपोर्ट के बारे में जानना चाहें.
कंपाइल किए गए कोड से बाहरी कोड में कॉल करने का समाधान एक्सटर्नल कोड के साथ कंपाइल करना
अगर आप अपने पेज पर दिए गए कोड का इस्तेमाल किसी दूसरी स्क्रिप्ट से करते हैं, तो आपको यह पक्का करना होगा कि क्लोज़र कंपाइलर आपके रेफ़रंस को उस बाहरी लाइब्रेरी में बताए गए सिंबल से न बदल दे. ऐसा करने के लिए, एक ऐसी फ़ाइल शामिल करें जिसमें बाहरी लाइब्रेरी के बाहरी हिस्से शामिल हों. इससे क्लोज़र कंपाइलर को यह जानकारी मिलेगी कि किन नामों को कंट्रोल नहीं किया जा सकता. इसलिए, नाम में कोई बदलाव नहीं किया जा सकेगा. आपके कोड में वही नाम होने चाहिए जो बाहरी फ़ाइल में इस्तेमाल किए जाते हैं.
इसके सामान्य उदाहरण,
OpenSocial API
और Google Maps API जैसे एपीआई हैं. उदाहरण के लिए, अगर
आपका कोड OpenSocial फ़ंक्शन opensocial.newDataRequest()
को कॉल करता है,
तो सही एक्सटेंशन के बिना, Closure कंपाइलर इस कॉल को
a.b()
में बदल देगा.
बाहरी कोड से कंपाइल किए गए कोड में कॉल करने का समाधान बाहरी एक्सटेंशन लागू करना
अगर आपके पास JavaScript कोड है, जिसे आप लाइब्रेरी के तौर पर फिर से इस्तेमाल करते हैं, तो हो सकता है कि आप लाइब्रेरी को छोटा करने के लिए क्लोज़र कंपाइलर का इस्तेमाल करना चाहें. साथ ही, लाइब्रेरी में फ़ंक्शन को कॉल करने के लिए, कंपाइल नहीं किया गया कोड डालना पड़ सकता है.
इस स्थिति में, आपकी लाइब्रेरी के सार्वजनिक एपीआई को तय करने वाले एक्सटेंशन का एक सेट लागू किया जाता है. आपका कोड, इस एक्सटेंशन में बताए गए सिंबल की परिभाषाएं देगा. इसका मतलब है कि आपके एक्सटर्नल एक्सटेंशन में किसी क्लास या फ़ंक्शन का उल्लेख किया गया है. इसका मतलब यह भी हो सकता है कि आपके क्लास ने बाहरी हिस्से में इंटरफ़ेस लागू किए हों.
ये एक्सटेंशन न सिर्फ़ आपके, बल्कि दूसरों के लिए भी उपयोगी हैं. अगर आपकी लाइब्रेरी का इस्तेमाल करने वाले कोड को कंपाइल कर रहे हैं, तो उन्हें उन्हें शामिल करना होगा, क्योंकि आपकी लाइब्रेरी उनके नज़रिये से बाहरी स्क्रिप्ट को दिखाती है. सेवा की शर्तों को आपके और आपके उपभोक्ताओं के बीच हुए अनुबंध के तौर पर देखें, इसके लिए आपको दोनों की ही कॉपी चाहिए.
इस काम के लिए, पक्का करें कि कोड कंपाइल करते समय, एक्सटर्नल एक्सटेंशन को भी कंपाइल में डालें. हो सकता है कि यह थोड़ा अजीब लग रहा हो, क्योंकि हम अक्सर बाहरी लोगों को "किसी और जगह से आने वाले" के तौर पर देखते हैं, लेकिन हो सकता है कि क्लोज़र कंपाइलर को यह बताना ज़रूरी हो कि आप कौनसे सिंबल देख रहे हैं, इसलिए उनका नाम नहीं बदला जाता.
यहां एक ज़रूरी बात यह है कि आपको बाहरी चिह्नों को परिभाषित करने वाले कोड के बारे में "डुप्लीकेट परिभाषा" में गड़बड़ी की जानकारी मिल सकती है. क्लोज़र कंपाइलर को लगता है कि बाहरी हिस्से में इस्तेमाल होने वाले किसी चिह्न की सप्लाई एक बाहरी लाइब्रेरी से की जा रही है. फ़िलहाल, वह यह नहीं समझ पा रहा है कि आप किसी परिभाषा की सप्लाई जान-बूझकर कर रहे हैं. इन गड़बड़ियों को दबाना सुरक्षित रहता है. साथ ही, आप इस बात को मानने के लिए इस पर दबाव डाल सकते हैं कि आप वाकई अपना एपीआई पूरा कर रहे हैं.
इसके अलावा, क्लोज़र कंपाइलर इस बात की जांच कर सकता है कि आपकी परिभाषाएं, बाहरी अनुरोधों के टाइप से मेल खाती हैं या नहीं. इससे यह पुष्टि होती है कि आपकी परिभाषाएं सही हैं.