2015-08-20 149 views
7

舉例來說,我有以下代碼:爲什麼uglifyjs不會刪除死碼?

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

var a = 5; 

然後我寫uglifyjs code.js -o code.min.js。因此,我有以下內容:

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

如何啓用刪除if語句內的死代碼?

+0

什麼是死代碼? ''console.log''?或整個if塊?前者是完全有效的代碼,具有完全有效的目的。它與優化''如果(a == 1 || a == 1)''非常不同。另外我認爲uglifier的優化非常有限。 – CppLearner

+0

if-block內的代碼永遠不會運行。所以,它已經死了。 – user2991036

+0

你需要靜態分析工具,而不僅僅是AST解析器。 – CppLearner

回答

8

儘管這個問題已經得到了公認的答案,我認爲這是值得一提的是,

  1. UglifyJS2確實去除死碼

  2. 要關閉此功能,你需要或者設置相應的選項在CLI(uglifyjs --compress unused,dead_code)或options對象中,如果以編程方式調用uglifyuglify(compress: { unused: true, dead_code: true });)。

+0

對於我來說,我還需要將評估和條件設置爲true,並將其他大部分內容設置爲false。我只想去死代碼,而不是任何其他的壓縮。 – Patrik

4

根據uglifyjs的README,維護者已將開發工作轉移到UglifyJS2。自述也說,它不僅能消除:

一些無法訪問的代碼,並警告它(隨後返回, 扔,打破或continue語句,除了功能/變量 聲明代碼)。

Uglify2做了一個更全面的工作。我在demo site上測試了你的代碼,它確實刪除了整個if語句。它還支持'條件編譯'(或者更準確地說,有條件的代碼刪除),允許你在uglifying時在命令行定義全局變量。

+0

謝謝你的幫助!這是我的問題的解決方案 – user2991036