移除注釋和空白
注釋的作用就不解釋了,使用者訪問你的網站,把一個帶注釋的代碼拿過去,而不會執行注釋的這段東西,豈不是白白浪費了這段代碼所帶來的網路頻寬。於是乎我們壓縮就應該把注釋給Del掉。
空白則是為了代碼美觀,易於程式員查看調試,對於解譯器來說,空白是無意義的,反而得花時間去掃描它,所以壓縮應該也要去除這些無意義的空白,包括縮排,空格,空行等。
做完這一步,只是第一層次的壓縮。為了使得JS檔案盡量的小,我們還得採用一些新思路。
最佳化代碼
我們是不是經常使用"abcd"+"efgh"這樣的字串拼接呢?於是我們考慮在壓縮的時候直接就壓縮成"abcdefgh"這樣對比一下,少了
兩個雙引號跟一個加號,如果使用字串拼接比較頻繁的話,這個最佳化會節省不少空間,並且提高了JS的執行效率(因為兩個字串拼接,解譯器需要重新去申請
記憶體空間,然後把兩端字串複製進去)。
對象的屬性訪問是不是也很頻繁呢?例如o["name"]等,又或者是定義了對象{"name":"Object"};這樣的話我們可以最佳化一下就是變成o.name以及{name:"Object"}節省幾個字元。
還有例如var a = new Array()最佳化成var a = []等(Object就是使用{}代替);連續的多個var定義可以用,來最佳化成一條語句定義。
同時也能適當的提高JS的執行效能!外語屋
千萬不要小看這幾個位元組,往往一個大型應用有多少使用者在下載你這個JS檔案,累積起來這個數字就很龐大了。
變數替換
要進一步縮小檔案大小的話,我們就要去分析一些JS的詞法文法,替換變數。簡單據個例子:
var myObj = 1;
myObj++;
myObj--;
alert(myObj);
變數替換的意思就是把原先的變數名換成更加短的變數名:
var A = 1;
A++;
A--;
alert(A);
自己比較一下就知道節省了多少個位元組,並且代碼被有效保護起來了,誰知道你的A是什麼含義,對吧?內陸運輸
當然了,我記得好像有看過更加牛逼的替換,印象中是最後再將全部字元轉化成16進位的\x的格式,有知道怎麼做的同志告知一下。
undefined最佳化
在你的代碼中是否經常出現 if (a != undefined)呢?很多包含undefined的語句,我們會看到這個單詞很長很不爽,又不能直接把它替換成一個短一點的單詞。於是後來看到了一種方法,在此之前我們先看看一個例子。
function f1(name){
alert(name);
}
f1();
我們可以發現調用f1時不帶參數,f1的name參數將會是undefined值。好,於是我們對undefined進行最佳化跟縮短了。
舉個例子,如果是下邊這樣的代碼:
(function(name, undefined){//在這裡undefined是一個變數!不信的話可以對此函數傳入多一個值試試
/* 在這裡就是我們的代碼地區 */
if (name != undefined)
alert(name);
})('name');/* 有效參數為函數定義時的參數少一個以上,這樣保證了第二個參數沒有傳入值,從而使其變成了undefined值 */
我們壓縮的時候就會把所有的undefined替換成一個變數A,這樣是不是縮短了很多位元組呢?像Jquery等架構都做了這個最佳化,jQuery的源碼的結構就是:
/*!
* jQuery JavaScript Library v1.6.2
* http://jquery.com/
*
* Copyright 2011, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Thu Jun 30 14:16:56 2011 -0400
*/
(function(window, undefined) {
/* jQuery Code */
window.jQuery = window.$ = jQuery;
})(window);