Omówienie ograniczeń nałożonych przez kompilatora zamknięcia

 |  Closure Compiler  |  Google for Developers (original) (raw)

Kompilacja Closure Compiler oczekuje, że dane wejściowe JavaScriptu będą zgodne z kilkoma ograniczeniami. Im wyższy poziom optymalizacji, w jakim oczekujesz kompilatora, tym więcej ograniczeń wprowadza on w danych wejściowych JavaScript.

W tym dokumencie opisano główne ograniczenia obowiązujące na każdym poziomie optymalizacji. Dodatkowe założenia przyjęte przez kompilatora znajdziesz też na tej stronie wiki.

Ograniczenia na wszystkich poziomach optymalizacji

Kompilator nakłada następujące 2 ograniczenia dotyczące całego kodu JavaScriptu, który jest przetwarzany, na wszystkich poziomach optymalizacji:

Ograniczenia dotyczące SIMPLE_OPTIMIZATIONS

Prosty poziom optymalizacji zmienia parametry funkcji, zmienne lokalne i funkcje zdefiniowane lokalnie, aby zmniejszyć rozmiar kodu. Jednak niektóre konstrukcje JavaScriptu mogą ten proces zmienić.

Jeśli używasz SIMPLE_OPTIMIZATIONS, unikaj tych konstrukcji i praktyk:

Ograniczenia dla ADVANCED_OPTIMIZATIONS

Poziom kompilacji ADVANCED_OPTIMIZATIONS jest taki sam jak przekształcenie SIMPLE_OPTIMIZATIONS, a także powoduje globalne zmiany nazw usług, zmiennych i funkcji, eliminację martwego kodu i spłaszczenie usługi. Te nowe karty nakładają dodatkowe ograniczenia na wejściowy kod JavaScript. Ogólnie rzecz biorąc, używanie dynamicznych funkcji JavaScriptu uniemożliwia prawidłowe analizowanie statycznego kodu.

Konsekwencje zmiany zmiennej globalnej, funkcji i właściwości:

Globalna zmiana nazwy usługi ADVANCED_OPTIMIZATIONS sprawia, że następujące praktyki są niebezpieczne:

Implications of dead code elimination

The ADVANCED_OPTIMIZATIONS compilation level removes code that is never executed. This elimination of dead code makes the following practices dangerous:

Kompilator nie rozumie, że wywołania initX() i initY() są wywoływane w pętli for, dlatego obie te metody zostaną usunięte.
Pamiętaj, że jeśli przekażesz funkcję jako parametr, kompilator może znaleźć wywołania tego parametru. Na przykład kompilator nie usuwa funkcji getHello() podczas kompilowania poniższego kodu w trybie zaawansowanym.
function alertF(f) {
alert(f());
}
function getHello() {
return 'hello';
}
// The Compiler figures out that this call to alertF also calls getHello().
alertF(getHello); // This is OK.

Konsekwencje spłaszczenia obiektu

W trybie zaawansowanym kompilator zwija właściwości obiektu, aby przygotować się do skrócenia nazwy. Na przykład kompilator przekształca to:

var foo = {}; foo.bar = function (a) { alert(a) }; foo.bar("hello");

w:

var foo$bar = function (a) { alert(a) }; foo$bar("hello");

Ta zmiana właściwości umożliwia późniejszą zmianę nazwy karty. Kompilator może zastąpić foo$bar jednym znakiem.

Jednak takie rozwiązanie zmniejsza też ryzyko: