使用 UglifyJS 對 JavaScript 進行壓縮

jopen 10年前發布 | 20K 次閱讀 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,那就全力以赴吧!

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!