บริการคอมไพเลอร์ Closure เลิกใช้งานแล้วและจะถูกนําออก โปรดลองเรียกใช้คอมไพเลอร์ในเครื่องแทน
ภาพรวม
การสื่อสารกับ API อธิบายข้อมูลพื้นฐานเกี่ยวกับวิธีสื่อสารกับบริการ Closure Compiler แต่แสดงภาพโดยใช้บริการเท่านั้นเพื่อตัดความคิดเห็นจาก JavaScript บรรทัดเดียว บทแนะนํานี้จะแสดงวิธีใช้บริการ Closure Compiler ในสถานการณ์การพัฒนาที่สมจริงมากขึ้น ซึ่งก็คือการประมวลผลไฟล์ JavaScript ทั้งไฟล์เพื่อลดขนาดลงอย่างมาก
บทแนะนํานี้จะถือว่าคุณมีความคุ้นเคยกับ JavaScript และ HTTP ในระดับพื้นฐาน แม้ว่าจะใช้สคริปต์ Python เพื่อส่ง JavaScript ไปยังบริการ Closure Compiler คุณไม่จําเป็นต้องรู้จัก Python ทําตามตัวอย่าง
การบีบอัดไฟล์
ตัวอย่างในการสื่อสารกับ API ส่งสตริง JavaScript เป็นพารามิเตอร์บรรทัดคําสั่งไปยังสคริปต์การรวบรวม อย่างไรก็ตาม วิธีนี้อาจทํางานได้ไม่ดีสําหรับโปรแกรม JavaScript ที่มีขนาดสมจริง แต่เนื่องจากสตริง JavaScript เริ่มใช้งานไม่ได้อย่างรวดเร็วเมื่อโค้ดยาวเกิน 2-3 บรรทัด สําหรับโปรแกรมขนาดใหญ่ คุณสามารถใช้พารามิเตอร์คําขอ code_url
เพื่อระบุชื่อไฟล์ JavaScript ที่จะประมวลผล คุณจะใช้ code_url
นอกเหนือจาก js_code
หรือใช้แทน 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();
คุณสามารถส่งโปรแกรมนี้ไปยังบริการ Closure Compiler ได้อย่างสะดวกสบายเป็นไฟล์มากกว่าสตริงเดียว ทําตามขั้นตอนต่อไปนี้เพื่อประมวลผลไฟล์กับบริการ
- บันทึก JavaScript ในไฟล์
- ทําให้เข้าถึงไฟล์บนเว็บได้ (เช่น อัปโหลดไฟล์ไปยังเว็บเซิร์ฟเวอร์ของคุณ)
- ส่งคําขอ POST ไปยังบริการ Closure Compiler ดังที่แสดงในส่วนการสื่อสารกับ API แต่สําหรับพารามิเตอร์
js_code
จะแทนที่พารามิเตอร์code_url
ค่าของcode_url
ต้องเป็น URL ของไฟล์ JavaScript ที่สร้างในขั้นตอนที่ 1
เช่น คุณจะค้นหา JavaScript สําหรับตัวอย่างนี้ได้ในไฟล์ tutorial2.js
หากต้องการประมวลผลไฟล์นี้ด้วย Closure Compiler Service API ให้เปลี่ยนโปรแกรม Python จาก Communication with API เพื่อใช้ 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 โปรดดูคําถามที่พบบ่อยเกี่ยวกับ Python Windows สําหรับวิธีการติดตั้งและใช้ Python ใต้ Windows
ส่งรหัสไปยังบริการคอมไพเลอร์ Closure ด้วยคําสั่งต่อไปนี้
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
บริการ Closure Compiler เรียกดูไฟล์จาก 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'), ])
การปรับปรุงการบีบอัด
ตัวอย่างจนถึงตอนนี้ก็ใช้ compilation_level
จาก WHITESPACE_ONLY
คะแนน ซึ่งเพิ่งหมดเขตการแสดงความคิดเห็นและการเว้นวรรค ระดับการบีบอัด 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 ใหม่มีขนาดน้อยกว่าครึ่งหนึ่งของต้นฉบับ
บริการคอมไพเลอร์จะปิดโปรแกรมน้อยลงได้อย่างไร
ในกรณีนี้ Closure Compiler ลดขนาดลงได้บางส่วนโดยการเปลี่ยนชื่อตัวแปรในเครื่อง เช่น ไฟล์ต้นฉบับ มีโค้ดบรรทัดนี้รวมอยู่ด้วย
var headerElement = document.createElement('div');
คอมไพเลอร์ Closure เปลี่ยนข้อความนี้เป็น:
var d=document.createElement("div");
คอมไพเลอร์ Closure จะเปลี่ยนสัญลักษณ์ headerElement
เป็น d
ทุกตําแหน่งภายในฟังก์ชัน makeNoteDom
และเพื่อรักษาฟังก์ชันการทํางานไว้ แต่อักขระ 13 ตัวของ headerElement
ได้ถูกตัดให้สั้นลงเหลือเพียง 1 อักขระจากทั้งหมด 3 ตําแหน่งที่ปรากฏ โดยใช้อักขระทั้งหมด 36 ตัว
การคอมไพล์ด้วย SIMPLE_OPTIMIZATIONS
จะใช้ฟังก์ชันของ JavaScript ที่ถูกต้องตามไวยากรณ์เสมอ โดยที่โค้ดจะไม่เข้าถึงตัวแปรในเครื่องที่ใช้ชื่อสตริง (เช่น eval()
คําสั่ง)
ขั้นตอนถัดไป
ตอนนี้คุณคุ้นเคยกับ SIMPLE_OPTIMIZATIONS
และ
กลไกพื้นฐานในการใช้บริการแล้ว ขั้นตอนถัดไปคือการเรียนรู้เกี่ยวกับระดับการรวบรวม ADVANCED_OPTIMIZATIONS
ระดับนี้ต้องใช้ขั้นตอนเพิ่มเติมเพื่อให้แน่ใจว่า JavaScript ทํางานในลักษณะเดียวกันก่อนและหลังการรวบรวม แต่จะทําให้ JavaScript มีขนาดเล็กลง โปรดดูการรวบรวมขั้นสูงและภายนอกเพื่อดูข้อมูลเกี่ยวกับ ADVANCED_OPTIMIZATIONS