Kompilator Closure umożliwia wybór jednego z 3 poziomów kompilacji – od prostego usuwania białych znaków i komentarzy po agresywne przekształcanie kodu.
WHITESPACE_ONLY
Poziom kompilacji WHITESPACE_ONLY
usuwa z kodu komentarze, a także znaki końca wiersza, zbędne spacje, niepotrzebne znaki interpunkcyjne (takie jak nawiasy i średniki) oraz inne białe znaki. Wygenerowany kod JavaScript jest funkcjonalnie identyczny z kodem źródłowym JavaScript.
Transpilacja funkcji językowych będzie nadal wykonywana, jeśli żądany tryb języka wyjściowego różni się od trybu języka wejściowego.
Zobacz --language_in
i --language_out
w sekcji Flagi i opcje.
Ten poziom kompilacji zapewnia najmniejszą kompresję ze wszystkich 3 poziomów.
SIMPLE_OPTIMIZATIONS
Poziom kompilacji SIMPLE_OPTIMIZATIONS
usuwa znaki odstępu i komentarze tak samo jak poziom WHITESPACE_ONLY
, ale dodatkowo optymalizuje wyrażenia i funkcje, w tym zmienia nazwy zmiennych lokalnych i parametrów funkcji na krótsze. Zmiana nazw zmiennych na krótsze znacznie zmniejsza rozmiar kodu. Ponieważ poziom SIMPLE_OPTIMIZATIONS
zmienia nazwy tylko symboli lokalnych dla funkcji, nie zakłóca interakcji między skompilowanym kodem JavaScript a innym kodem JavaScript.
Kompilacja z SIMPLE_OPTIMIZATIONS
zawsze zachowuje funkcjonalność prawidłowego składniowo kodu JavaScript, pod warunkiem że kod nie uzyskuje dostępu do zmiennych lokalnych za pomocą nazw ciągów tekstowych (np. za pomocą instrukcji eval()
lub przez wywoływanie funkcji toString).
SIMPLE_OPTIMIZATIONS
to domyślny poziom kompilacji.
ADVANCED_OPTIMIZATIONS
Poziom kompilacji ADVANCED_OPTIMIZATIONS
wykonuje te same przekształcenia co poziom SIMPLE_OPTIMIZATIONS
, ale dodaje do nich szereg bardziej agresywnych przekształceń globalnych, aby osiągnąć najwyższy stopień kompresji ze wszystkich 3 poziomów. Poziom ADVANCED_OPTIMIZATIONS
kompresuje JavaScript znacznie lepiej niż inne narzędzia.
Aby włączyć tę ekstremalną kompresję, ADVANCED_OPTIMIZATIONS
przyjmuje silne założenia dotyczące skompilowanego kodu. Jeśli Twój kod nie spełnia tych założeń, ADVANCED_OPTIMIZATIONS
wygeneruje kod, który nie będzie działać.
Na przykład kod skompilowany za pomocą ADVANCED_OPTIMIZATIONS
może nie działać z nieskompilowanym kodem, chyba że podejmiesz specjalne kroki w celu zapewnienia interoperacyjności. Jeśli nie oznaczysz funkcji zewnętrznych i właściwości, do których odwołuje się Twój kod, kompilator Closure Compiler nieprawidłowo zmieni nazwy odwołań w Twoim kodzie, co spowoduje niezgodność między nazwami w Twoim kodzie a nazwami w kodzie zewnętrznym.
Aby dowiedzieć się więcej o przygotowywaniu kodu do ADVANCED_OPTIMIZATIONS
, przeczytaj artykuł Zaawansowana kompilacja i pliki extern.
Transformacje ADVANCED_OPTIMIZATIONS
obejmują:
- bardziej agresywne zmienianie nazw:
Kompilacja za pomocą funkcji
SIMPLE_OPTIMIZATIONS
zmienia tylko nazwy parametrów i zmiennych w funkcjach.ADVANCED_OPTIMIZATIONS
zmienia też nazwy zmiennych globalnych, funkcji i właściwości. - usuwanie martwego kodu;
Kompilacja z
ADVANCED_OPTIMIZATIONS
usuwa kod, który jest w sposób udowodniony nieosiągalny. Jest to szczególnie przydatne w przypadku dużych bibliotek. Jeśli używasz tylko kilku funkcji z dużego pliku biblioteki, kompilator może usunąć z danych wyjściowych wszystko oprócz tych funkcji. - globalne wstawianie;
Kompilacja z użyciem
ADVANCED_OPTIMIZATIONS
zastępuje niektóre wywołania funkcji treścią funkcji. To przekształcenie jest znane jako „wstawianie”. Kompilator wstawia funkcje w kodzie tylko wtedy, gdy uzna, że jest to bezpieczne i pozwala zaoszczędzić miejsce. Kompilacja zADVANCED_OPTIMIZATIONS
obejmuje też wstawianie stałych i niektórych zmiennych, gdy kompilator uzna, że może to zrobić w bezpieczny sposób.
Jak ustawić poziom kompilacji
Aby ustawić poziom kompilacji w aplikacji Closure Compiler, dodaj flagę wiersza poleceń --compilation_level
z wartością WHITESPACE_ONLY
, SIMPLE
lub ADVANCED
, jak w tym poleceniu:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js