[開源]jquery-ajax-cache:快速優化頁面ajax請求,使用localStorage緩存請求


  項目:jquery-ajax-cache

  地址:https://github.com/WQTeam/jquery-ajax-cache

  star   d

  最近在項目中用到了本地緩存localStorage做數據的緩存。

1、簡單說下localStorage

  localStorage和cookies相比,在瀏覽器中存儲的容量更大。另外最大的特點是不會附帶在http請求中傳給后台,不會像cookies一樣導致http頭部變大影響傳輸性能。基於這個原因,localStorage適合緩存一些常用的數據,無需平凡的像后台請求數據。

  localStorage的API非常簡單 參考

  常用的兩個方法 setItem 和 getItem

  

localStorage.setItem(key, value);   

locaStorage.getItem(key); // return value

  

  由於存儲的內容都是 string 類型。當需要存入js 對象時。需要先把js 對象轉為string。方法也很簡單JSON.stringify,取出時對應的使用JSON.parse

2、項目中該如何使用localStorage

  localStorage 作為一種前端的存儲方式和后台的數據庫相比,最大的不同是這種儲存是一種不可靠的存儲。用戶可以隨時清除瀏覽器緩存,另外一些瀏覽器的無痕瀏覽模式會禁用localStorage。所以localStorage最好只是用為性能優化的緩存,而不是數據的持久化。但作為緩存localStorage又太過簡單,無法設置超時時間,另一個項目有為此做了擴展:web-storage-cache   。

3、實際運用中有沒有更好的方式

  項目中做性能優化,我們都希望優化的方式是不影響原有代碼、不增加新的代碼邏輯。

  假設業務場景中有某段數據是被多個地方用到的,最直觀的做法是:

  

var data = localStorage.getItem('cacheKey');

if (!data) { // 如果data為空,發出請求
 $.ajax({
   url: 'xxxx',
   success: function(response) {
     if(response.code === 1) { // success!
        loccalStorage.setItem('cacheKey', response.data);
     }
// 其他業務處理。。。 } }) }

 

    如果接口設計是統一的,可以統一封裝自己的ajax方法,攔截請求

function myAjax() {
    var arg = arguments[0];
    var realSuccess = arg.success;
    var realBeforeSend = arg.beforeSend;
    arg.success = function(response) {
    if(response.code === 1) {
        localStorage.setItem(cacheKey /*需要根據請求參數生成不一樣的key*/ , response.data);
    }
    realSuccess && realSuccess.apply(null, arguments);
    }
    $.ajax(arg);
}

   如上面代碼,同理可以增加beforeSend攔截請求判斷是否在緩存中讀取。這樣業務邏輯就更少的受到影響。

 

4、jQuery本身支持ajax方法的擴展

  上面是大多人采用的方式,但事實上jQuery對ajax提供了更好的擴展方式。通過$.ajaxPrefilter 和 $.ajaxTransport這兩個方法可以更好的做攔截。jquery-ajax-cache插件中使用的也是這種方式。

 

   本人對剛剛定為標准的ES2015 和 webpack都挺有興趣,所以此開源項目都有用到。

 

5、關於jquery-ajax-cache

  jquery-ajax-cache 插件擴展了jQuery的$.ajax,提供非常便利的方式緩存ajax請求到‘localStorage’或‘sessionStorage’中。你唯一要做的就是實現cacheValidate方法,驗證返回結果是否需要緩存。頁面加載和數據讀寫過程插件都會進行過期數據清除,避免過期數據的堆積。同時你也可以調用$ajaxCache.deleteAllExpires()手動清除過期緩存。

  全局配置

$ajaxCache.config({
    // 業務邏輯判斷請求是否緩存, res為ajax返回結果, options 為 $.ajax 的參數
    cacheValidate: function (res, options) {    //選填,配置全局的驗證是否需要進行緩存的方法,“全局配置” 和 ”自定義“,至少有一處實現cacheValidate方法
        return res.state === 'ok';
    },
    storageType: 'localStorage', //選填,‘localStorage’ or 'sessionStorage', 默認‘localStorage’
    timeout: 60 * 60, //選填, 單位秒。默認1小時
});

     簡單實用

$.ajax({
    // 使用時 只要增加給ajax請求增加一行屬性   ajaxCache: true
    ajaxCache: true     // “全局配置” 和 ”自定義“,至少有一處實現cacheValidate方法
    /*
     others...
    */
});

 自定義

$.ajax(
    // 此處的參數會覆蓋‘全局配置’中的設置
    ajaxCache: {
        // 業務邏輯判斷請求是否緩存, res為ajax返回結果, options 為 $.ajax 的參數
        cacheValidate: function (res, options) { //選填,配置全局的驗證是否需要進行緩存的方法, “全局配置” 和 ”自定義“,至少有一處實現cacheValidate方法
            return res.state === 'ok' && res.code ==='200';
        },
        storageType: 'localStorage', //選填,‘localStorage’ or 'sessionStorage', 默認‘localStorage’
        timeout: 60 * 60, //選填, 單位秒。默認1小時
    }
});

 

由於個人能力有限,難免有bug,可以反映到https://github.com/WQTeam/jquery-ajax-cache/issues

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM