使用 UglifyJS 對 JavaScript 進行壓縮
UglifyJS 以其高效的Javascript壓縮器而知名. UglifyJS 默認的壓縮設置很好用,但還沒有發揮出全部潛力. 還有許多的附加指令可以用于壓縮選項,包括:
sequences — 使用逗號操作符加入連續的簡單語句
</li>properties — 使用點好重寫屬性訪問,例如foo["bar"] → foo.bar
</li>dead_code — 移除不可達的代碼
</li>drop_debugger — 移除調試器和調試語句
</li>unsafe (default: false) — 應用“不安全”的轉換(下面會討論到)
</li>conditionals — 為if -s 和條件表達式應用優化
</li>comparisons — 針對二進制節點應用某些特定的優化,例如:!(a <= b) → a > b (只在不安全時), 嘗試去否認二進制節點,例如.a = !b && !c && !d && !e → a=!(b||c||d||e) 等等.
</li>evaluate — 嘗試去計算常量表達式
</li>booleans — 多種針對布爾上下文的優化,例如 !!a ? b : c → a ? b : c
</li>loops — 當我們可以靜態的判斷條件的取值時,針對do,while和for循環的優化
</li>unused — 去掉沒有被引用過的函數和變量
</li>hoist_funs — 提升函數聲明
</li>hoist_vars (默認值: false) — 提升var聲明 (因為一般看起會增加輸出的大小,所以它默認是false的)
</li>if_return — 這對 if/return 和 if/continue 的優化
</li>join_vars —加入連續的var語句
</li>cascade — 對于 sequences, transform x, x into xandx = something(), x into x = something() 的一些小優化
</li>warnings — 當去掉不可達代碼或者沒有被使用的聲明等東西時,顯示警告.
</li>negate_iife — 在返回值被丟棄的地方否認 "即刻調用函數表達式", 來避免代碼生成器會插入的括號.
</li>pure_getters — 默認為false。如果你傳入true, UglifyJS 會假定對象屬性訪問(例如. foo.bar 或者 foo["bar"]) 不會有任何副作用.
</li>pure_funcs — 默認為null. 你可以傳入一個名稱的數組,而UglifyJs將會假定那些函數不會產生副作用. 危險: 如果名稱在作用范圍內被重新定義了就不會檢查. 這里有一個示例場景, 例如 var q = Math.floor(a/b). 如果變量q沒有在別的地方使用, UglifyJS 會去掉它,但是仍然會保留 Math.floor(a/b), 而不清楚它是做什么用的. 你可以傳入 pure_funcs: [ 'Math.floor' ] 來讓其知道這個函數不會產生任何副作用, 在這種情況下,整個語句會被丟棄. 當前的實現會增加一些開銷(壓縮會變慢).
</li>drop_console — 默認為false. 傳入true會丟棄對console.函數的調用.
</li> </ul> </blockquote>因此可以通過 修改布爾值 , 移除不必要var語句,砍掉不可達代碼以及其它更多的辦法,UglifyJS把你的js文件中多余的東西就擠了出來,而不只是做一下簡單的壓縮而已. 這里有一個使用NodeJS API的場景示例:
var UglifyJS = require('uglify-js'); var fs = require('fs');var result = UglifyJS.minify('site.js', { mangle: true, compress: { sequences: true, dead_code: true, conditionals: true, booleans: true, unused: true, if_return: true, join_vars: true, drop_console: true } });
fs.writeFileSync('site.min.js', result.code);</pre>
你也可以通過命令行傳入那些壓縮值.本文之意義不在開創,而更多的是去提升那種運用起來很簡便的意識 —compress 并不會對任何潛在的方面都進行最小化優化. 如果你想要最小化壓縮你的js,那就全力以赴吧!