Poziomy kompilacji kompilatora Closure Compiler

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--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 z ADVANCED_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