[开源]jquery-ajax-cache:快速优化页面ajax请求,使用localStorage缓存请求
地址: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
[开源]jquery-ajax-cache:快速优化页面ajax请求,使用localStorage缓存请求的更多相关文章
- [原创]jQuery的this和$(this)
网上有很多关于jQuery的this和$(this)的介绍,大多数只是理清了this和$(this)的指向,其实它是有应用场所的,不能一概而论在jQuery调用成员函数时,this就是指向dom对象. ...
- 使用jquery的trigger方法优化页面代码
我们做页面级联的时候经常会用到ajax处理数据,会为下拉菜单编写change事件. //城市和区域联动 $("#City").change(function () { var ci ...
- python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...
- Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件
一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...
- jquery ajax cache的问题
function test() { $.ajax({ type:'GET', url:"tt. ...
- [干货]2017已来,最全面试总结——这些Android面试题你一定需要
地址.http://blog.csdn.net/xhmj12/article/details/54730883 相关阅读: 吊炸天!74款APP完整源码! [干货精品,值得收藏]超全的一线互联 ...
- Jquery学习笔记--性能优化建议
一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或 ...
- jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器
jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTran ...
- jQuery源码分析系列(34) : Ajax - 预处理jsonp
上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处 ...
随机推荐
- DB2_001_MQT
MQT stands for Materialed Query Table.它的定义是建立在查询结果之上的,把动态查询的结果放到表中,表中的数据随着基础表中数据的变化而变化.当基础表中的数据变化时,M ...
- 折腾iPhone的生活——运营商信号显示数据化
iOS7以后iphone的信号都是用5个小圆圈显示的,像这样 但是还有种显示方法可以用数字信号显示信号量,比较适合很专注于生活品质的人和对数字有偏爱的人,像这样: 这样还有个好处是可以节约顶部状态栏的 ...
- jQuery 数据 DOM 元素 核心 属性
jQuery 参考手册 - 数据 .clearQueue() 从序列中删除仍未运行的所有项目 .clearQueue(queueName) $("div").clearQueue( ...
- (转载)绿色版Mysql的安装配置
本文出自于:http://johnnyhg.javaeye.com/blog/245544 一.下载MySQL http://www.mysql.org/downloads 我下载的是mysql-no ...
- OpenSource
SugarCRM 客户关系管理系统(CRM).SugarCRM开源版是一款完全开放源代码的商业开源软件 OPENFILER 基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接 ...
- HDU 2069 Coin Change
Coin Change Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- [RxJS] Aggregating Streams With Reduce And Scan using RxJS
What is the RxJS equivalent of Array reduce? What if I want to emit my reduced or aggregated value a ...
- android 41 Environment
assets通常存储音频视频文件,但不要太大. Environment可以获取sd卡的相关信息,sd卡的根路径:/storage/sdcard activity.java package com.sx ...
- 模拟dispatch_once
dispatch_once dispatch_once可以保证一段代码只被执行一次,因此出现之后使用最多的场景就是实现单例.本文来模拟实现dispatch_once的功能. 模拟dispatch_ ...
- Android热门网络框架Volley详解
.Volley简介 volley的英文意思为‘群发’.‘迸发’.Volley是2013年谷歌官方发布的一款Android平台上的网络通信库.Volley非常适合一些数据量不大,但需要频繁通信的网络操作 ...