地址:https://github.com/WQTeam/jquery-ajax-cache
最近在項目中用到了本地緩存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都挺有興趣,所以此開源項目都有用到。
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