2015-08-20 23 views
7

Na przykład, mam następujący kod:Dlaczego uglifyjs nie usuwa martwego kodu?

if ("a" !== "a") { 
    console.log('really?'); 
} 

var a = 5; 

Potem piszę uglifyjs code.js -o code.min.js. W rezultacie mam następujące:

if("a"!=="a"){console.log("really?")}var a=5; 

Jak włączyć usuwanie martwego kodu wewnątrz instrukcji if?

+0

Co to jest martwy kod? '' console.log''? lub cały blok if? Ten pierwszy jest doskonale poprawnym kodem o całkowicie poprawnym celu. Jest bardzo różny od optymalizacji '' if (a == 1 || a == 1) ''. Plus myślę, że wulgaryzm ma bardzo ograniczoną optymalizację. – CppLearner

+0

Kod wewnątrz bloku if nigdy nie będzie działał. Więc jest martwy. – user2991036

+0

potrzebujesz narzędzia do analizy statycznej, a nie tylko analizatora AST. – CppLearner

Odpowiedz

8

Mimo to pytanie ma już zaakceptowanej odpowiedź, myślę, że warto wspomnieć, że

  1. UglifyJS2 robi usunąć martwy kod

  2. Aby włączyć tę funkcję, należy ustawić odpowiednią opcję albo w CLI (uglifyjs --compress unused,dead_code) lub w obiekcie options, jeśli programowo wywoła się uglify (uglify(compress: { unused: true, dead_code: true });).

+0

Dla mnie, ja także musiałem ustawić wartość ewaluacyjną i warunki warunkowe na true, i ustawić większość innych rzeczy na fałsz. Chciałem tylko wyeliminować martwy kod, a nie inną kompresję. – Patrik

4

Zgodnie z README dla uglifyjs, opiekun zmienił wysiłek programistyczny na UglifyJS2. README mówi również, że tylko usuwa:

jakiś nieosiągalny kod i ostrzec o nim (kod, który następuje zwrot, rzucać, łamać lub kontynuować oświadczenie, z wyjątkiem funkcji/zmiennej deklaracji).

Uglify2 wykonuje bardziej wszechstronną pracę. Przetestowałem Twój kod na demo site i rzeczywiście usunięto całe polecenie if. Obsługuje także "kompilację warunkową" (lub może bardziej poprawnie warunkowe usuwanie kodu), umożliwiając definiowanie globów w linii komend podczas uglifowania.

+0

Dziękujemy za pomoc! To jest rozwiązanie dla mojego problemu. – user2991036