क्लोज़र कंपाइलर की सेवा बंद कर दी गई है और इसे हटा दिया जाएगा. इसके बजाय, कंपाइलर को स्थानीय तौर पर चलाएं.
खास जानकारी
API के साथ संपर्क करना में क्लोज़र कंपाइलर सेवा से संचार करने की बुनियादी बातों के बारे में बताया गया था. हालांकि, उसे सिर्फ़ सेवा की मदद से JavaScript की सिर्फ़ एक लाइन से टिप्पणियां हटाने के बारे में बताया गया था. यह ट्यूटोरियल, इस बात को दिखाता है कि क्लोज़र कंपाइलर की सेवा को इस्तेमाल करने के ज़्यादा सही उदाहरण को कैसे इस्तेमाल किया जा सकता है: साइज़ में बहुत ज़्यादा कमी लाने के लिए, पूरी JavaScript फ़ाइल को प्रोसेस करना.
इस ट्यूटोरियल में यह माना जाता है कि आपको JavaScript और एचटीटीपी की बुनियादी जानकारी है. हालांकि, यह Closure कंपाइलर सेवा में JavaScript को सबमिट करने के लिए Python स्क्रिप्ट का उपयोग करता है, लेकिन उदाहरण का पालन करने के लिए आपको Python की जानकारी होना ज़रूरी नहीं है.
फ़ाइल कंप्रेस करना
एपीआई के साथ बातचीत करने के उदाहरण में, JavaScript स्ट्रिंग को कमांड लाइन पैरामीटर के तौर पर, हमारी कंपाइलेशन स्क्रिप्ट में पास किया गया है. हालांकि, यह तरीका असल में आकार वाले JavaScript प्रोग्राम के लिए बहुत अच्छी तरह से काम नहीं करेगा. इसकी वजह यह है कि कोड को तय की गई संख्या से ज़्यादा समय तक इस्तेमाल करने पर, JavaScript स्ट्रिंग जल्दी ही बंद हो जाती है. बड़े प्रोग्राम के लिए, code_url
प्रोसेस पैरामीटर का इस्तेमाल करके यह प्रोसेस किया जा सकता है कि JavaScript फ़ाइल का नाम क्या है. js_code
के लिए, code_url
का इस्तेमाल किया जा सकता है या js_code
की जगह पर इसका इस्तेमाल किया जा सकता है.
उदाहरण के लिए, इस JavaScript प्रोग्राम पर विचार करें:
/** * A simple script for adding a list of notes to a page. The list diplays * the text of each note under its title. */ /** * Creates the DOM structure for a note and adds it to the document. */ function makeNoteDom(noteTitle, noteContent, noteContainer) { // Create DOM structure to represent the note. var headerElement = document.createElement('div'); var headerText = document.createTextNode(noteTitle); headerElement.appendChild(headerText); var contentElement = document.createElement('div'); var contentText = document.createTextNode(noteContent); contentElement.appendChild(contentText); var newNote = document.createElement('div'); newNote.appendChild(headerElement); newNote.appendChild(contentElement); // Add the note's DOM structure to the document. noteContainer.appendChild(newNote); } /** * Iterates over a list of note data objects and creates a DOM */ function makeNotes(data, noteContainer) { for (var i = 0; i < data.length; i++) { makeNoteDom(data[i].title, data[i].content, noteContainer); } } function main() { var noteData = [ {title: 'Note 1', content: 'Content of Note 1'}, {title: 'Note 2', content: 'Content of Note 2'}]; var noteListElement = document.getElementById('notes'); makeNotes(noteData, noteListElement); } main();
इस प्रोग्राम को क्लोज़र कंपाइलर सेवा में, एक बड़ी स्ट्रिंग के बजाय फ़ाइल के तौर पर ज़्यादा आसानी से पास किया जा सकता है. सेवा के साथ फ़ाइल प्रोसेस करने के लिए यह तरीका अपनाएं:
- JavaScript को फ़ाइल में सेव करें.
- फ़ाइल को वेब पर ऐक्सेस करने लायक बनाएं (उदाहरण के लिए, उसे अपने वेब सर्वर पर अपलोड करके).
- एपीआई के साथ कम्यूनिकेट करना में दिखाए गए क्लोज़र कंपाइलर सेवा के लिए पोस्ट अनुरोध करें, लेकिन
js_code
पैरामीटर के लिएcode_url
पैरामीटर बदलें.code_url
की वैल्यू, पहले चरण में बनाई गई JavaScript फ़ाइल का यूआरएल होनी चाहिए.
उदाहरण के लिए, फ़ाइल tutorial2.js
में इस उदाहरण के लिए JavaScript देखा जा सकता है. इस फ़ाइल को क्लोज़र कंपाइलर सर्विस एपीआई से प्रोसेस करने के लिए, पायथॉन प्रोग्राम में बदलाव करें. इसके लिए, एपीआई का इस्तेमाल करें को code_url
इस्तेमाल करें, ताकि:
#!/usr/bin/python2.4 import httplib, urllib, sys # Define the parameters for the POST request and encode them in # a URL-safe format. params = urllib.urlencode([ ('code_url', sys.argv[1]), # <--- This parameter has a new name! ('compilation_level', 'WHITESPACE_ONLY'), ('output_format', 'text'), ('output_info', 'compiled_code'), ]) # Always use the following value for the Content-type header. 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()
ध्यान दें: इस उदाहरण को फिर से बनाने के लिए, Windows के उपयोगकर्ताओं को Python इंस्टॉल करना पड़ सकता है. Windows में Python इंस्टॉल करने और इसका इस्तेमाल करने के निर्देश पाने के लिए, Python Windows से जुड़े अक्सर पूछे जाने वाले सवाल देखें.
यह तय करने के लिए, स्लैश क्लोज़र कंपाइलर सेवा को कोड भेजें:
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
Closure कंपाइलर सेवा
https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
से फ़ाइल निकालती है और प्रतिक्रिया में कंप्रेस की गई JavaScript दिखाती है.
एक से ज़्यादा आउटपुट फ़ाइलों को एक आउटपुट फ़ाइल में एक साथ जोड़ने के लिए, कई code_url
पैरामीटर शामिल करें, जैसा कि इस उदाहरण में दिया गया है:
params = urllib.urlencode([ # Multiple code_url parameters: ('code_url', 'http://yourserver.com/yourJsPart1.js'), ('code_url', 'http://yourserver.com/yourJsPart2.js'), ('compilation_level', 'WHITESPACE_ONLY'), ('output_format', 'text'), ('output_info', 'compiled_code'), ])
कंप्रेस करने की प्रक्रिया को बेहतर बनाना
अब तक के उदाहरणों में WHITESPACE_ONLY
के compilation_level
का इस्तेमाल किया गया है, जो सिर्फ़ टिप्पणियां और खाली जगह हटाता है. SIMPLE_OPTIMIZATIONS
कंप्रेस करने के लेवल की मदद से,
आप बहुत ज़्यादा कंप्रेस करने की दर पा सकते हैं. SIMPLE_OPTIMIZATIONS
कंप्रेशन का इस्तेमाल करने के लिए, compilation_level
पैरामीटर
को SIMPLE_OPTIMIZATIONS
में बदलें:
params = urllib.urlencode([ ('code_url', sys.argv[1]), ('compilation_level', 'SIMPLE_OPTIMIZATIONS'), # <--- This parameter has a new value! ('output_format', 'text'), ('output_info', 'compiled_code'), ])
और पहले की तरह स्क्रिप्ट चलाएं:
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
आउटपुट ऐसा दिखना चाहिए:
var GLOBAL_document=document,$$PROP_appendChild="appendChild";function makeNoteDom(a,b,c){var d=GLOBAL_document.createElement("div");a=GLOBAL_document.createTextNode(a);d[$$PROP_appendChild](a);a=GLOBAL_document.createElement("div");b=GLOBAL_document.createTextNode(b);a[$$PROP_appendChild](b);b=GLOBAL_document.createElement("div");b[$$PROP_appendChild](d);b[$$PROP_appendChild](a);c[$$PROP_appendChild](b)}function makeNotes(a,b){for(var c=0;c<a.length;c++)makeNoteDom(a[c].title,a[c].content,b)} function main(){var a=[{title:"Note 1",content:"Content of Note 1"},{title:"Note 2",content:"Content of Note 2"}],b=GLOBAL_document.getElementById("notes");makeNotes(a,b)}main();
कोड को सोर्स प्रोग्राम से पढ़ना मुश्किल होता है, लेकिन यह छोटा है.
कोड कितना छोटा है?
अगर हम अपने अनुरोध पैरामीटर में output_info
को compiled_code
से बदलकर statistics
करते हैं, तो हम देख सकते हैं कि हमने सटीक रूप से कितना स्थान बचाया है:
Original Size: 1372 Compressed Size: 677 Compilation Time: 0
नई JavaScript, ओरिजनल साइज़ के आधे से कम है.
क्लोज़र कंपाइलर सेवा ने इस प्रोग्राम को कैसे छोटा किया?
इस मामले में, क्लोज़र कंपाइलर स्थानीय वैरिएबल का नाम बदलकर उन हिस्सों के आकार में कमी हासिल करता है. उदाहरण के लिए, मूल फ़ाइल में कोड की यह लाइन शामिल है:
var headerElement = document.createElement('div');
क्लोज़र कंपाइलर इस स्टेटमेंट को इसमें बदल देता है:
var d=document.createElement("div");
क्लोज़र कंपाइलर सिंबल को headerElement
d
से
makeNoteDom
हर जगह बदल देता है और इस तरह
फ़ंक्शन को सुरक्षित रखता है. हालांकि, headerElement
के 13 वर्णों में से हर एक को एक ही वर्ण में दिखाया गया है. इससे 36 वर्णों की कुल बचत होती है.
SIMPLE_OPTIMIZATIONS
के साथ मिलकर काम करने पर, सिंटैक्स के हिसाब से मान्य JavaScript का फ़ंक्शन सुरक्षित रहता है. हालांकि, ऐसा करने पर कोड, स्ट्रिंग के नामों का इस्तेमाल करके, लोकल वैरिएबल को ऐक्सेस नहीं कर पाता है. उदाहरण के लिए, eval()
स्टेटमेंट.
अगले चरण
अब जब आप SIMPLE_OPTIMIZATIONS
और इस सेवा का इस्तेमाल करने की बुनियादी तकनीकों से परिचित हैं, तो अगला चरण है
ADVANCED_OPTIMIZATIONS
कंपाइलेशन लेवल के बारे में जानना. इस लेवल में कुछ अतिरिक्त चरणों की ज़रूरत होती है. इससे, यह पक्का किया जा सकता है कि आपकी JavaScript, कंपाइलेशन से पहले और बाद में एक ही तरह से काम करे. हालांकि, इससे JavaScript और छोटी हो जाती है. ADVANCED_OPTIMIZATIONS
के बारे में जानने के लिए, बेहतर कंपाइलेशन और एक्सटेंशन देखें.