Kompilator zamknięty został wycofany i zostanie usunięty. Zamiast tego rozważ uruchomienie kompilatora lokalnie.
Omówienie
Komunikaty dotyczące interfejsu API zawierały podstawowe informacje o tym, jak komunikować się z usługą Closure Compiler, ale za pomocą tej usługi można usunąć tylko komentarze z jednego wiersza kodu JavaScript. W tym samouczku pokazujemy, jak używać usługi kompilatora Closure.
W tym samouczku zakładamy, że masz podstawową znajomość JavaScriptu i HTTP. Do przesyłania kodu JavaScript do usługi Closure Compiler używany jest skrypt w Pythonie, ale nie trzeba znać języka Python, żeby postępować zgodnie z przykładem.
Kompresowanie pliku
Przykład podany w komunikacji z interfejsem API przekazał ciąg znaków JavaScript jako parametr wiersza poleceń do skryptu kompilacji. Takie podejście nie sprawdza się jednak w przypadku programu JavaScript o realistycznym rozmiarze, ponieważ ciąg znaków JavaScript szybko staje się niezrozumiały, gdy kod jest dłuższy niż kilka wierszy. W przypadku większych programów możesz użyć parametru żądania code_url
, aby określić nazwę pliku JavaScript do przetworzenia. Oprócz js_code
możesz też użyć code_url
lub zamiennika js_code
.
Weźmy na przykład taki program 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();
Ten program możesz łatwiej przesłać do usługi Closure Compiler jako plik, a nie jako jeden duży ciąg. Aby przetworzyć plik za pomocą usługi, wykonaj te czynności:
- Zapisz kod JavaScript w pliku.
- Udostępnij plik w internecie (np. przesyłając go na serwer WWW).
- Wyślij żądanie POST do usługi Closure Compiler, tak jak to zostało opisane w komunikacji z interfejsem API, ale w przypadku parametru
js_code
zastąp parametrcode_url
. Wartościącode_url
musi być adres URL pliku JavaScript utworzonego w kroku 1.
Kod JavaScript tego przykładu można znaleźć w pliku tutorial2.js
. Aby przetworzyć ten plik za pomocą interfejsu API usługi Closure Compiler, zmień program Pythona z komunikacji z tym interfejsem API na 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()
Uwaga: aby odtworzyć ten przykład, użytkownicy systemu Windows mogą zainstalować Pythona. Przeczytaj sekcję Najczęstsze pytania na temat Pythona Windows, aby dowiedzieć się, jak zainstalować i używać Pythona w systemie Windows.
Wyślij kod do kompilatora zamkniętych za pomocą tego polecenia:
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
Usługa Closure Compiler pobiera plik z witryny https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
i zwraca w odpowiedzi skompresowany kod JavaScript.
Aby skompilować wiele plików wyjściowych w jedny plik wyjściowy, uwzględnij wiele parametrów code_url
, jak w tym przykładzie:
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'), ])
Poprawa kompresji
W przykładach wykorzystano compilation_level
WHITESPACE_ONLY
, które usuwają tylko komentarze i spacje. Dzięki poziomowi kompresji SIMPLE_OPTIMIZATIONS
możesz osiągnąć znacznie wyższe współczynniki kompresji. Aby użyć kompresji SIMPLE_OPTIMIZATIONS
, zmień parametr compilation_level
na 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'), ])
i uruchom skrypt w zwykły sposób:
$ python compile.py https://closure-compiler.appspot.com/closure/compiler/samples/tutorial2.js
Dane wyjściowe powinny wyglądać tak:
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();
Ten kod jest trudniejszy do odczytania niż program źródłowy, ale jest mniejszy.
O ile mniejszy jest kod?
Jeśli zmienisz parametr output_info
w parametrach żądania z compiled_code
na statistics
, możemy dokładnie zobaczyć, ile miejsca zaoszczędziliśmy:
Original Size: 1372 Compressed Size: 677 Compilation Time: 0
Nowy kod JavaScript ma mniej niż połowę rozmiar oryginału.
Jak usługa kompilatora sprzątania zmniejszyła program?
W tym przypadku Kompresor zamknięty dokonuje częściowego zmniejszenia rozmiaru przez zmianę nazw lokalnych zmiennych. Na przykład oryginalny plik zawiera ten wiersz kodu:
var headerElement = document.createElement('div');
Kompresor zamknięty zmienia to oświadczenie na:
var d=document.createElement("div");
Kompilator zamknięty zmienia symbol headerElement
na d
w każdym miejscu funkcji makeNoteDom
i dlatego zachowa tę funkcjonalność. Jednak 13 znaków „headerElement
” został skrócony do 3 znaków w każdym z tych 3 miejsc. Dzięki temu można zaoszczędzić 36 znaków.
Kompilacja z parametrem SIMPLE_OPTIMIZATIONS
zawsze zachowuje funkcje o prawidłowym składni JavaScript, pod warunkiem że kod nie uzyskuje dostępu do zmiennych lokalnych za pomocą nazw ciągów (np. instrukcji eval()
).
Dalsze kroki
Teraz gdy znasz już funkcję SIMPLE_OPTIMIZATIONS
i podstawy korzystania z niej, następnym krokiem jest poznanie poziomu kompilacji. Ten poziom wymaga wykonania kilku dodatkowych czynności, aby JavaScript mógł działać tak samo przed kompilacją i po nim, ale sprawia, że jest on jeszcze mniejszy. Więcej informacji o ADVANCED_OPTIMIZATIONS
znajdziesz w artykule Zaawansowane kompilacje i rozszerzenia.