Layanan compiler Closure tidak digunakan lagi, dan akan dihapus. Sebaiknya jalankan compiler secara lokal.
Ringkasan
Berkomunikasi dengan API menjelaskan dasar-dasar cara berkomunikasi dengan layanan Compiler Closure, tetapi hanya diilustrasikan menggunakan layanan untuk menghapus komentar dari satu baris JavaScript. Tutorial ini mengilustrasikan cara menggunakan layanan Closure Compiler dalam skenario pengembangan yang lebih realistis: memproses seluruh file JavaScript untuk mencapai pengurangan ukuran yang signifikan.
Tutorial ini mengasumsikan bahwa Anda telah memiliki pengetahuan dasar tentang JavaScript dan HTTP. Meskipun skrip ini menggunakan skrip Python untuk mengirimkan JavaScript ke layanan Closure Compiler, Anda tidak perlu mengetahui Python untuk mengikuti contoh.
Mengompresi File
Contoh di bagian Berkomunikasi dengan API meneruskan
string JavaScript sebagai parameter command line ke skrip
kompilasi. Namun, pendekatan ini tidak akan berfungsi dengan baik untuk program JavaScript
berukuran realistis, karena string JavaScript dengan cepat
menjadi berat saat kode lebih panjang dari beberapa baris. Untuk program
yang lebih besar, Anda dapat menggunakan parameter permintaan code_url
untuk
menentukan nama file JavaScript yang akan diproses. Anda dapat
menggunakan code_url
selain js_code
, atau sebagai
pengganti js_code
.
Misalnya, pertimbangkan program JavaScript berikut:
/** * 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();
Anda dapat meneruskan program ini ke layanan Closure Compiler dengan lebih mudah sebagai file daripada sebagai satu string besar. Ikuti langkah-langkah berikut untuk memproses file dengan layanan:
- Menyimpan JavaScript dalam file.
- Membuat file dapat diakses di web (misalnya, dengan menguploadnya ke server web Anda).
- Buat permintaan POST ke layanan Closure Compiler seperti yang ditunjukkan
dalam Berkomunikasi dengan API, tetapi untuk
parameter
js_code
menggantikan parametercode_url
. Nilaicode_url
harus berupa URL file JavaScript yang dibuat di Langkah 1.
Misalnya, Anda dapat menemukan JavaScript untuk contoh ini di file
tutorial2.js
. Untuk
memproses file ini dengan Closure Compiler service API, ubah
program python dari Berkomunikasi
dengan API untuk menggunakan code_url
, seperti berikut:
#!/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()
Catatan: Untuk mereproduksi contoh ini, pengguna Windows mungkin perlu menginstal Python. Lihat FAQ Python Windows untuk mendapatkan petunjuk tentang cara menginstal dan menggunakan Python di bawah Windows.
Kirim kode ke layanan Closure Compiler dengan perintah berikut:
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
Layanan Closure Compiler mengambil file dari https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
dan menampilkan JavaScript terkompresi dalam respons.
Untuk mengompilasi beberapa file output sekaligus menjadi satu file output,
sertakan beberapa parameter code_url
, seperti dalam contoh ini:
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'), ])
Meningkatkan Kompresi
Contoh sejauh ini telah menggunakan compilation_level
dari WHITESPACE_ONLY
, yang hanya menghapus komentar dan mengosongkan
ruang kosong. Dengan level kompresi SIMPLE_OPTIMIZATIONS
,
Anda dapat mencapai tingkat kompresi yang jauh lebih tinggi. Untuk
menggunakan kompresi SIMPLE_OPTIMIZATIONS
, ubah
parameter compilation_level
menjadi 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'), ])
dan jalankan skrip seperti sebelumnya:
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
Output akan terlihat seperti ini:
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();
Kode ini lebih sulit dibaca daripada program sumber, tetapi lebih kecil.
Seberapa Kecil Kodenya?
Jika output_info
dalam parameter permintaan diubah dari compiled_code
menjadi statistics
, kita dapat melihat dengan tepat jumlah ruang yang dihemat:
Original Size: 1372 Compressed Size: 677 Compilation Time: 0
JavaScript baru kurang dari setengah ukuran aslinya.
Bagaimana Layanan Closure Compiler Membuat Program Lebih Kecil?
Dalam hal ini, Closure Compiler mencapai pengurangan ukuran sebagian dengan mengganti nama variabel lokal. Misalnya, file asli menyertakan baris kode ini:
var headerElement = document.createElement('div');
Closure Compiler mengubah pernyataan ini menjadi:
var d=document.createElement("div");
Closure Compiler mengubah simbol headerElement
menjadi d
di mana saja dalam fungsi makeNoteDom
, sehingga mempertahankan fungsi. Namun, 13 karakter headerElement
telah dipersingkat menjadi satu karakter di masing-masing dari tiga tempat
tempat karakter tersebut muncul. Dengan begitu, total penghematan 36 karakter.
Kompilasi dengan SIMPLE_OPTIMIZATIONS
selalu mempertahankan
fungsi JavaScript yang valid secara sintaksis, asalkan kode tersebut
tidak mengakses variabel lokal menggunakan nama string (misalnya,
pernyataan eval()
).
Langkah Berikutnya
Setelah Anda memahami SIMPLE_OPTIMIZATIONS
dan
mekanisme dasar penggunaan layanan, langkah berikutnya adalah mempelajari
tingkat kompilasi ADVANCED_OPTIMIZATIONS
. Tingkat ini
memerlukan beberapa langkah tambahan untuk memastikan bahwa JavaScript Anda berfungsi
dengan cara yang sama sebelum dan setelah kompilasi, tetapi hal ini membuat JavaScript
lebih kecil lagi. Lihat Kompilasi Lanjutan dan Eksternal untuk mempelajari ADVANCED_OPTIMIZATIONS
.