最近在APP里新增一个论坛模块,为了快速地完成,决定将整个论坛模块作成WEB APP,WEB APP最致命的就是用户体验问题,页面跳转和过多的请求,大大影响了加载速度和用户体验,这时候我想到了HTML5的离线储存。css
1、应用场景html
咱们一般使用浏览器缓存在用户磁盘上存储web单页,在用户再次浏览的时候已节省带宽,但即使这样,依然没法在没有Internet的状况下访问 Web。为了让web应用程序在离线状态也能被访问。html5经过application cache API提供离线存储功能。前提是你须要访问的web页面至少被在线访问过一次。html5
离线本地存储和传统的浏览器缓存有什么不一样呢?web
一、浏览器缓存主要包含两类:面试
a.缓存协商:Last-modified,Etagajax
浏览器向服务器询问页面是否被修改过,若是没有修改就返回304,浏览器直接浏览本地缓存文件。不然服务器返回新内容。浏览器
b.完全缓存:cache-control,Expires缓存
经过Expires设置缓存失效时间,在失效以前不须要再跟服务器请求交互。服务器
二、离线存储为整个web提供服务,浏览器缓存只缓存单个页面;app
三、离线存储能够指定须要缓存的文件和哪些文件只能在线浏览,浏览器缓存没法指定;
四、离线存储能够动态通知用户进行更新。
2、如何实现
离线存储是经过manifest文件来管理的,须要服务器端的支持,不一样的服务器开启支持的方式也是不一样的。
CACHE MANIFEST//必须以这个开头
version 1.0 //最好定义版本,更新的时候只需修改版本号
CACHE:
m.png
test.js
test.css
NETWORK:
*
FALLBACK
online.html offline.html
CACHE指定须要缓存的文件;NETWORK指定只有经过联网才能浏览的文件,*表明除了在CACHE中的文件;FALLBACK每行分别指定在线和离线时使用的文件
要让manifest管理存储,还须要在html标签中定义manifest属性,以下:
DOCTYPE HTML>
<</span>html lang="en" manifest='test.manifest'>
<</span>head>
<</span>meta charset="UTF-8">
<</span>title></</span>title>
</</span>head>
<</span>body>
</</span>body>
</</span>html>
最后别忘了,这些应用须要服务器支持。
Apache服务器开启支持的方式是:在conf/mime.types中添加一段代码:
test/cache-manifest manifest
IIS服务器开启方式:
右键--HTTP---MIME映射下,单击文件类型---新建---扩展名输入manifest,类型中输入test/cache-manifest
3、经过JS动态控制更新
applicationCache对象提供个了一些方法和事件,管理离线存储的交互过程。经过在firefox8.0的控制台中输入window.applicationCache能够看到这个对象的所
有属性和事件方法。
applicationCache.onchecking = function(){
//检查manifest文件是否存在
}
applicationCache.ondownloading = function(){
//检查到有manifest或者manifest文件
//已更新就执行下载操做
//即便须要缓存的文件在请求时服务器已经返回过了
}
applicationCache.onnoupdate = function(){
//返回304表示没有更新,通知浏览器直接使用本地文件
}
applicationCache.onprogress = function(){
//下载的时候周期性的触发,能够经过它
//获取已经下载的文件个数
}
applicationCache.oncached = function(){
//下载结束后触发,表示缓存成功
}
application.onupdateready = function(){
//第二次载入,若是manifest被更新
//在下载结束时候触发
//不触发onchched
alert("本地缓存正在更新中。。。");
if(confirm("是否从新载入已更新文件")){
applicationCache.swapCache();
location.reload();
}
}
applicationCache.onobsolete = function(){
//未找到文件,返回404或者401时候触发
}
applicationCache.onerror = function(){
//其余和离线存储有关的错误
}
4、浏览器与服务器的交互
曾经有面试题是这样的:"描述在浏览器的地址栏中输入:http://www.baidu.com 后发生了什么?"。
一、服务端返回baidu页面资源,浏览器载入html
二、浏览器开始解析
三、发现link,发送请求载入css文件
四、浏览器渲染页面
五、发现图片,发送请求载入图片,并从新渲染
六、发送请求js文件,阻塞渲染。若是js对dom进行了操做,则会进行rerender
对于支持离线存储的页面,浏览器和服务器的交互又是如何呢?
首次载入页面:
1-6 : 同上
7:请求页面中须要缓存的页面和数据,就算在以前的步骤中已经请求过(这是个耗能的地方)
8:服务器返回全部请求文件,浏览器进行本地存储
再次载入页面:
1:发送请求
2:使用本地存储的离线文件
3:解析页面
4:请求服务端的manifest文件,判断是否有改变,返回304则表示没有改变进入步骤5,不然进入步骤6(jaykon:这里是否是错了?304时会进入6才对)
5:进入首次载入页面的7-8(jaykon:这里注意,就算这次请求manifest文件更新了,也只是在页面宣染完成后从新下载里面路径的文件,这些新文件要在下一次访问时才会体现出来,好比再次刷新时。)
6:使用本地存储,不从新请求