1. 程式人生 > >高效能JavaScript(高效能Ajax)

高效能JavaScript(高效能Ajax)

ajax是一種與伺服器通訊而無需過載頁面的方法(即區域性重新整理。)

高效能的Ajax應該考慮資料傳輸技術和資料格式,以及其他的如資料快取等優化技術。

 

請求資料

請求資料的常用技術有XMLHttpRequest(XHR),動態指令碼注入、Multipart XHR、iframes、Comet五種,其中前三種比較常見,後兩種往往在比較極端的情況下使用。

 

XHR

XMLHttpRequest是目前最常用的技術,可以在請求中新增頭資訊和引數,讀取伺服器返回的所有頭資訊和響應文字,下面是一個簡單的例子

 

readyState的值等於3時,說明這是ajax與伺服器正在進行互動,相應資訊還在傳輸過程中。

XHR 提供了高階的控制,所以瀏覽器對其增加了一些限制。不能是用 XHR 從外域請求資料,也就是跨域。而且低版本的IE 沒有 readyState 為 3 的狀態

當請求的URL加上引數的長度接近 2048 個字元時,需要使用 post 獲取資料。過長將會導致請求的URL被截斷。

 

動態指令碼注入

克服了XHR的限制:能夠跨域請求資料

通過建立script標籤,將src指向不同域的url即可

XHR相比:

(1) 動態指令碼注入無法設定頭資訊, 

(2) 只能使用get方式,不能使用post方式

(3) 不能訪問請求的頭資訊,也不能將響應訊息作為字串來處理,響應訊息一般是可執行的javascript指令碼(其他待返回的XML、JSON或其他格式的資料都要封裝在一個回撥函式中)

 

Multipart XHR(新技術)

MXHR允許客戶端只用一個HTTP請求從伺服器端向客戶端傳送多個資源。它通過在伺服器端將多個資源(css檔案、HTML片段、js程式碼、base64編碼的圖片)打包成一個由雙方約定的特定字元分割的長字串傳送到客戶端。然後,在客戶端根據那個特定的字元將這個長字串解析成各個資源。

 

發起請求

var xhr = new XMLHttpRequest(); 

xhr.open('get','data.php',true);

xhr.onreadystatechange = function(){
   
if(xhr.readyState == 4){ splitImage(xhr.responseText) } }

服務端處理資料

$dataArr=array();
$images=array('1.jpg','2.jpg','3.jpg');
foreach($images as $img){
  $file=fopen($img,'r');
  $imgdata=fread($file,filesize($img));
  $imgdata=base64_encode($imgdata);
  fclose($file);
  array_push($dataArr,$imgdata);
}
$newchar=chr(1);
echo implode($newchar,$dataArr);//使用一個不會出現在base64中的一個字元將各個圖片的base64編碼連成一個長字串

資料到達客戶端後,再進行解析

function splitImage(imgstring){
  var imgdata=imgstring.split(\u0001'); //將字串分割
  var img=document.createElement('img');
  for(var i=0,len=imgdata.length;i<len;i++){
    var tmpimg=img.cloneNode();
    tmpimg.src="data:image/jpeg;base64,"+imgdata[i];
    document.getElementById('div1').appendChild(tmpimg);
  }
}

由於一次性請求的資源多,所以不必等待所有資源都返回在進行處理,可以根據readyState狀態值監測響應狀態,當readyState為3時,就對接收到的部分資料進行處理。 

優點:一次可以請求多個資源,提升效能

缺點:獲取的資源不能被瀏覽器快取

 

傳送資料

XHR

GET方式受瀏覽器的最大URL尺寸限制,當上傳資料量較大時,用POST方式。 

對於少量資料,GET方式會更快,因為一個GET請求往伺服器只發送一個數據包,而一個POST請求,至少要傳送兩個資料包,一個裝載頭資訊,一個裝載 POST正文。

 

資料格式

伺服器端與客戶端進行資料傳輸時,資料的格式會影響其下載速度和解析速度,一般來說JSON形式和字元分隔的自定義格式是最好的。XML、HTML一般會增加資料量,解析較慢。

 

XML

最開始是流行 XML作為資料格式,當時的優勢:極佳的通用性-服務端和客戶端都能完美支援。格式嚴格,易於驗證。

 

JSON

json是現在ajax常用的資料結構,用陣列和物件直接量編寫。

相比於XML 傳輸尺寸小,解析速度快。是 高效能AJAX的基礎。

 

HTML

伺服器渲染的專案會將完整的html以及js、css傳給瀏覽器,瀏覽器直接解析成頁面。HTML程式碼比XML更繁雜,這意味著需要佔用更多的網路資源去下載html。

 

自定義格式

你可以與伺服器端約定好傳輸的資料的格式,比如以特定的字元作為分隔符分隔字串,在客戶端用split()方法切割成需要的資料。

 

資料格式總結

大資料量且要求解析時間的話,可以選擇:

JSON-P資料,使用動態指令碼獲取,把資料當做js指令碼執行而不是字串,解析速度極快,能跨域使用,涉及敏感資料時不應使用 

自定義資料,用XHR或動態指令碼注入獲取,通過split解析,比JSON-P略快

 

快取資料

最快的請求就是沒有請求,有兩種方法可避免傳送不必要的請求

在服務端,設定 HTTP 頭資訊可以確保你的響應會被瀏覽器快取

在客戶端可以吧獲取到的資訊儲存在本地,從而避免再次請求。

第一種簡單而且好維護,第二種則有很大的控制權。

設定HTTP頭資訊

$lifetime=7*24*60*60;

header('Expires'.gmdate('D,d M Y H:i:s',time()+$lifetime).'GMT');

客戶端實現:

把響應資訊儲存到一個本地物件中

 

小結

瞭解專案的具體需求,選擇正確的資料格式和與之匹配的傳輸技術

還可以:

 

減少請求數

 

縮短頁面載入時間 主要內容載入完畢 ajax 獲取次要檔案

 

儘量不要吧程式碼錯誤輸出給使用者

 

**本章內容沒學好,有不對的地方還望指正,感激不盡