浅谈浏览器缓存-2016

浏览器缓存发展历史.png

前(fei)言(hua):新年第一篇文章, 这一博文代码准备许久奈何之前比较忙,春节后这几天有空总结下浏览器缓存。

浏览器缓存历史简介

浏览器缓存实现一开始各家浏览器厂商标配的都是Cookies, 随着前端显示越来越复杂,Cookies那可怜的几K容量明显不够用了;在2000年至2008年间,没有统一标准出现了很多浏览器缓存的插件实现如:Flash SharedObject ,Google Gears;HTML5标准的提出,出现了很多缓存的标准如:localstorage** ,webSqlIndexDb;HTML5**大热的时候,离线Web应用市场一度被看好,相应的浏览器缓存技术也备受关注;大热后的今天, 我们慢下来静静的总(tu)结(cao)下浏览器的那些缓存技术。(HTML5 标准2006年提出,2014年才正式发布,提出约两年后开始被重视)

HTML5标准正式发布.png

浏览器缓存实践

Adobe 插件存储(Flash SharedObject)跟Google插件存储(Gears SQLite)均需要安装插件且本人没使用过,暂时不写,日后有机会接触再补上;本文主要写HTML5离线存储标准实践以及实际开发中浏览器缓存的实现方案,因本文Demo代码量比较大,故主要贴上实现的核心代码
1.localStorage、sessionStorage 是HTML5 规范,IE8就支持了,不同浏览器总大小不同,大概为5MB;

localStorage浏览器支持.png

localStorage和sessionStorage的API都相同(用法一样),区别只在于关闭浏览器选项卡时sessionStorage的数据会消失而localStorage的会保留;用法灰常简单:

保存数据:

setItem('key', 'keyValue');

获得数据:

getItem('key'); 

删除数据:

removeItem('key', 'keyValue'); 

clear();

谷歌、safari(旧版)以及大部分国产浏览器的极速模式查看localStorage、sessionStorage的数据都是这样的:


浏览器控制台显示localStorage.png
  1. Cookies 比较老的缓存实现方式,不同浏览器支持的Cookie 个数跟容量不同,容量大概4K;(各浏览器Cookie大小、个数限制
    Cookies用法相对于上述的localStorage会比较麻烦,因为缓存数据的增、删、改、查都是操作同一段字符串;关键代码:
document.cookie = 'xxx';

Cookies用法.png

Cookie数据保存的时间、保存的路径、域名等都通过字符串拼接操作实现;
PS: 部分浏览器(如chrome)需要部署在虚拟服务器才能操作Cookie;
浏览器控制台显示Cookies.png

3.userData(只有IE浏览器支持), Flash、Gears这类需要安装插件的缓存应用场景比较有限,本文不展开研究了,但考虑到国内IE浏览器的使用份额,userData比以上同时期两货实用的多,所以有必要展开下;
userData的实现就是页面加载时创建一个input标签,该标签首先调用:

load('file_name');

在C盘目录(路径下面详述)生成xml文件,然后用户交互产生的缓存数据通过给input标签添加(或删除)属性存储:

setAttribute('key', 'keyValue');
removeAttribute('key');

添加(或删除)属性后调用'save'方法就将结果保存到对应的xml文件了:

save('file_name');
userData用法1.png

userData用法2.png

userData存储的位置:
在XP下,一般位于C:\Documents and Settings\用户名\UserData,有些时候会在C:\Documents and Settings\用户名\Application Data\Microsoft\Internet Explorer\UserData。
在Vista下,位于C:\Users\用户名\AppData\Roaming\Microsoft\Internet Explorer\UserData。
PS: 使用userData时, 清空浏览器所有缓存都无法清除userData存储的数据,需要到上述文件夹下手动删除对应的xml文件才能清除成功;

4.webSql HTML5新增缓存机制,IE所有版本(包括edge) firefox均不支持, PC端目前基本无法投入使用;Web SQL Database
这么多浏览器不支持该标准的原因估计是API太复杂了!!!以下是它实现插入缓存代码,体验下:

webSql用法.png

基本是将sqlserver 、mysql那一套的语法拿过来了, 但偏偏前端浏览器又没办法实现如mysql那么强大的功能, 没有公主命却一身公主病
支持该方案的只有了chrome 、 safari :

浏览器控制台显示webSql.png

PS: w3c 已表示不再维护,indexDb代替之。

5.IndexDb HTML5规范的另一缓存机制, 浏览器支持情况比websql好一些; IE10(edge14仍是部分支持)开始部分支持, firefox、chrome、Opera全支持、safari8开始部分支持;实际开发同上,暂时鸡肋;
上述的 webSql 基本成历史, IndexDb将代替它继续更新;但本人对它未来还是挺悲观的,为啥?如果说有哪个缓存标准的API比webSql难用 那一定是 IndexDb!
跟Cookie、localStorage实现相同功能它的代码是这样的:

IndexDb用法.png

上述代码仅仅是存入数据而已, 还有跟它同等长度的查询、插入代码;(indexDb增删改查的详细操作代码请看demo源码)总的来说该标准API对开发者及不友好;
存入成功后,查看存储数据:
浏览器控制台显示IndexDb.png

PS: 网上很多教程中的db.setVersion方法已被弃用,IndexDb标准最新版没有 setVersion 了,现在是 onupgradeneeded !

实际开发中,缓存使用:cookiesUtils、localStorageUtils

cookiesUtilsCookie存储实现都是将参数拼接成字符串然后将字符串赋值给“document.cookie”, 实际项目中不可能经常拼接,所以都使用封装的Cookie库;附上本人写的cookiesUtils
localStorageUtils:实际项目中另一常用的存储方案就是localStorage, 比Cookie好用且兼容大部分浏览器; 就目前而言唯一的不足是不兼容IE6 IE7, 如结合上述的userData将兼容所有浏览器,在低版本IE浏览器中使用userData实现localStorage方法,localStorageUtils就是这样的封装实现;

总结

HTML5 众多存储方案中,目前使用最为广泛的当然是 localstorage、sessionStorage了, 如考虑低版本浏览器,Cookies还是主流的选择;当然,浏览器端存储的数据容量毕竟有限,大数据还是得后台加载,分页或懒加载显示;

本文源码:
demo源码
参考文章:
各浏览器cookie大小、个数限制;
webSql官方文档;
indexDb使用详解;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容