एक्सटर्नल का मकसद
एक्सटेंशन, ऐसे एलान होते हैं जिनसे क्लोज़र कंपाइलर को ऐसे सिंबल के नाम दिए जाते हैं जिनका नाम बेहतर कंपाइलेशन के दौरान नहीं बदला जाना चाहिए. इन्हें बाहरी एक्सटेंशन कहा जाता है, क्योंकि आम तौर पर इन चिह्नों का इस्तेमाल, कंपाइलेशन के बाहर मौजूद कोड से किया जाता है. उदाहरण के लिए, नेटिव कोड या तीसरे पक्ष की लाइब्रेरी. इस वजह से, बाहरी हिस्से में अक्सर टाइप के एनोटेशन भी होते हैं, ताकि क्लोज़र कंपाइलर उन सिंबल के आपके इस्तेमाल को टाइपटाइप कर सकें.
आम तौर पर, एक्सटर्नल एक्सटेंशन को, लागू करने वाले कोड और कंपाइल किए गए कोड के किसी हिस्से के उपभोक्ताओं के बीच एपीआई समझौते के तौर पर इस्तेमाल करना बेहतर होता है. एक्सटर्नल से पता चलता है कि कॉन्टेंट उपलब्ध कराने वाला व्यक्ति किस चीज़ का वादा करता है और उपभोक्ता किस बात पर भरोसा कर सकते हैं. दोनों पक्षों को अनुबंध की एक कॉपी की ज़रूरत होती है.
एक्सटेंशन, अन्य भाषाओं में मौजूद हेडर फ़ाइलों की तरह होते हैं.
बाहरी सिंटैक्स
एक्सटेंशन ऐसी फ़ाइलें होती हैं जो क्लोज़र कंपाइलर के लिए इस्तेमाल किए गए सामान्य JavaScript की तरह दिखती हैं. मुख्य अंतर यह है कि उनके कॉन्टेंट को कभी भी कंपाइल किए गए आउटपुट के हिस्से के तौर पर प्रिंट नहीं किया जाता है. इसलिए, इनमें से किसी भी वैल्यू का कोई मतलब नहीं होता है. यह सिर्फ़ नाम और टाइप के लिए होती है.
नीचे एक सामान्य लाइब्रेरी के लिए, एक्सटर्न फ़ाइल का एक उदाहरण दिया गया है.
// 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
एनोटेशन कंपाइलर को यह बताने का सबसे अच्छा तरीका है कि फ़ाइल में एक्सटेंशन मौजूद हैं. ऐसी फ़ाइलों को --js
कमांड-लाइन फ़्लैग का इस्तेमाल करके, सामान्य सोर्स फ़ाइलों
के तौर पर शामिल किया जा सकता है,
हालांकि, बाहरी फ़ाइलों को तय करने का एक और पुराना तरीका मौजूद है. एक्सटर्नल फ़ाइलों को साफ़ तौर पर पास करने के लिए, --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; }
क्लोज़र कंपाइलर सेवा एपीआई से, एक्स्टर्न शामिल करने का तरीका
क्लोज़र कंपाइलर ऐप्लिकेशन और Closure कंपाइलर सेवा एपीआई, दोनों ही बाहरी एलान करने की अनुमति देते हैं. हालांकि, क्लोज़र कंपाइलर सेवा यूज़र इंटरफ़ेस (यूआई) बाहरी फ़ाइलों के बारे में बताने के लिए इंटरफ़ेस एलिमेंट नहीं उपलब्ध कराता है.
क्लोज़र कंपाइलर सेवा को मौजूदा एलान भेजने का तरीका यहां दिया गया है:
-
सोर्स फ़ाइल के तौर पर
@externs
एनोटेशन वाली फ़ाइल पास करें. -
JavaScript को
js_externs
पैरामीटर में, क्लोज़र कंपाइलर सेवा को पास करें. -
JavaScript फ़ाइल का यूआरएल,
externs_url
पैरामीटर में क्लोज़र कंपाइलर सेवा को पास करें.
js_externs
का इस्तेमाल करने और externs_url
का इस्तेमाल करने में अंतर सिर्फ़ यह है कि JavaScript को क्लोज़र कंपाइलर सेवा के बारे में कैसे बताया जाता है.
एक्सपोर्ट का मकसद
एक्सपोर्ट के अलावा, कंपाइलेशन के बाद सिंबल को एक जैसा नाम देने का भी एक और तरीका है. वे बाहरी लोगों की तुलना में कम उपयोगी होते हैं और अक्सर भ्रमित करते हैं. सभी सामान्य मामलों में ऐसा करने से बचा जा सकता है.
एक्सपोर्ट इस बात पर निर्भर करते हैं कि क्लोज़र कंपाइलर स्ट्रिंग लिटरल में बदलाव नहीं करता. लिटरल का इस्तेमाल करके, किसी प्रॉपर्टी को ऑब्जेक्ट असाइन करने से, कंपाइलेशन के बाद भी वह प्रॉपर्टी प्रॉपर्टी के नाम से उपलब्ध होगी.
नीचे एक उदाहरण दिया गया है.
/** * @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
फ़ंक्शन का इस्तेमाल करके भी किया जा सकता है.
इस बारे में ज़्यादा जानकारी, बंद करने वाली लाइब्रेरी के दस्तावेज़ों में उपलब्ध है. हालांकि, ध्यान रखें कि उनके पास खास कंपाइलर सहायता दी गई हो और वे पूरी तरह से कंपाइल किए गए आउटपुट में बदल जाएं.
एक्सपोर्ट से जुड़ी समस्याएं
एक्सटर्नल एक्सटर्नल एक्सटर्नल (एक्सटर्नल इमेज) इस तरह से बनाए जाते हैं कि वे सिर्फ़ संदर्भ के तौर पर सार्वजनिक किए गए एलियस बनाते हैं. कंपाइल किए गए कोड में, एक्सपोर्ट किए गए सिंबल का नाम अब भी बदला रहेगा. इस वजह से, एक्सपोर्ट किए गए सिंबल एक जैसे होने चाहिए, क्योंकि उन्हें अपने कोड में फिर से असाइन करने पर, एक्सपोज़ किया गया उपनाम गलत आइटम की ओर इशारा करेगा.
नाम बदलने में यह बारीकी खास तौर पर जटिल होती है, क्योंकि इसमें एक्सपोर्ट की गई इंस्टेंस प्रॉपर्टी शामिल होती हैं.
इस वजह से, एक्सटर्नल कोड की तुलना में एक्सपोर्ट का कोड साइज़ छोटा हो सकता है, क्योंकि लंबी अवधि वाले नाम को अब भी छोटे कोड में बदला जा सकता है. असल में, ये सुधार अक्सर बहुत छोटे होते हैं. इनसे, भ्रम में पड़ रहे एक्सपोर्ट के बारे में बात नहीं होती.
एक्सटर्नल, उपभोक्ताओं के लिए इस तरीके से पालन करने के लिए एपीआई उपलब्ध नहीं कराते. एक्सपोर्ट की तुलना में, एक्सटर्नल उन चिह्नों का दस्तावेज़ बनाता है जिन्हें आप ज़ाहिर करना चाहते हैं, उनका टाइप, और आपको इस्तेमाल की जानकारी जोड़ने की जगह देता है. इसके अलावा, अगर आपके ग्राहक भी क्लोज़र कंपाइलर का इस्तेमाल कर रहे हैं, तो उन्हें कंपाइल करने के लिए एक्सटेंशन की ज़रूरत होगी.