首頁 > web前端 > js教程 > 主體

有趣的UglifyJS

php中世界最好的语言
發布: 2018-03-16 10:53:13
原創
2104 人瀏覽過

這次帶給大家有趣的UglifyJS,使用UglifyJS的注意事項有哪些,以下就是實戰案例,一起來看一下。

也不是閒著沒事去看壓縮程式碼,但今天調試自己程式碼的時候發現有點意思。因為是自己寫的,雖然壓縮了,格式化之後還是很好辨認。當然作為min的首要準則不是可讀性,而是精簡。那麼它會盡量的縮短程式碼,盡量的保持一行,最大化的減少的空白。我們常用的分號都會被替換成了逗號,短句變成了連貫的長句。

1.立即執行函數

#我本來是第二種寫法,uglify給我替換成了第一種(當然更短一點)。其實括號和!號的作用都是將funtion的部分轉成一個表達式,而不再是申明。這樣就能立即執行,同理~   +都可以做到。

2.變數名稱替換

這個是自然的,函數名稱、參數名稱、變數名稱都替換成了單一字母。甚至是‘_’

3.函數置頂

function foo (){} 這種形式的程式碼都會被放到模組的最頂端。當然這是一種規範,後來發現還有另一個作用就是方便後面的程式碼合併。 例如 我們這樣定義:

var self=this;function a(){}
self.a=a;function b(){}
self.b=b;return self;
登入後複製

會替換成:

function a(){}function b(){}var s={}return  s.a={},s.b={},s
登入後複製

注意到最後的s 不能漏了,return會以最後一個表達式的結果為準。

  function rt(n) {    return n;
   }  function xx() {      return rt(1), rt(2);
  }
登入後複製

執行xx()得到的是2,如果 rt(2)後面還有個不回傳值的函數執行,那麼xx()就會得到undefined。

4.bool值替換

false-->!1  true-->!0
登入後複製

5.if 

if語句是被壓縮最多的地方。

1) return 前置:

 function load() {            if (t) {
                x = false;
                log("error");                return;
            }
            console.log("22")
        }
登入後複製

例如我的原始函數大概是這樣。壓縮後成了這樣:

  if (t) return x =!1,void log("error")
登入後複製

return提前了,最後多了一個void。 這是為什麼呢。 沒有大括號,if的四段程式碼變成了一句話。 void的在這裡的作用是抹掉函數的回傳值。因為本來的這個if 是沒有回傳值的 。如果這個時候log方法帶有回傳值。那麼呼叫load就會拿到這個回傳值。這會產生幹擾,違背了原函數的本意。所以用void抹掉了。 

2) 短路

     function foo() {            if (!x) {                return;
            }
            console.log("doA");
            console.log("doB");
  }
登入後複製

壓縮後:

    function f() {
            x || console.log("doA"), console.log("doB");
      }
登入後複製

這樣蠻不錯的。同理:

(x&&y){
 doa();
 dob(); 
}
 doc();  
 -->    x&&y&&(doa(),dob()),doc()
登入後複製

原本四行變成了一行程式碼。

3).為了合併一行,這也行:

    console.log("doA");
    console.log("doB");     if (x>0) {
         console.log("true");
      }
登入後複製

合併成這樣:

 if (console.log("doA"), console.log("doB"), x > 0) console.log("true");
登入後複製

平時這麼寫可能不太友好,重點是在if語句中,最後一句才是判斷句。結合之前的return。想必對逗號語句有了深刻的認識。

4)throw也不放過

 if (errMsg) {
       util.triggerCallback(fail, "模型验证错误");       throw Error(errMsg);
  }
登入後複製

壓縮後:

 if (a)  throw x.triggerCallback(o, "模型验证错误"), Error(a)
登入後複製

調換了語句的順序,把throw看成return 就明白了。

5) if else

這會被替換成三元表達式  a?b:c 。

6.數字處理

整百整千的會處理成科學數 1000 -->1e3 。

7. while

var offset = 0;            while (true) {                if (offset >= bufferLength) {                    break;
                }
}
登入後複製

會替換成這樣:

  for (var n = 0; ; ) {                if (n >= K)                    break
 }
登入後複製

確實不錯,節省了一行程式碼。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

讓JS自動比對proto Js的方法

##h5做出網頁錄音功能

以上是有趣的UglifyJS的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板