本文摘自PHP中文网,作者黄舟,侵删。
一、应用场景 我们通常使用浏览器缓存在用户磁盘上存储web单页,在用户再次浏览的时候已节省带宽,但即便这样,依然无法在没有Internet的情况下访问Web。为了让web应用程序在离线状态也能被访问。html5通过application cache API提供离线存储功能。前提是你需要访问的web页面至少被在线访问过一次。
离线本地存储和传统的浏览器缓存有什么不同呢?
1、浏览器缓存主要包含两类:
a.缓存协商:Last-modified,Etag
浏览器向服务器询问页面是否被修改过,如果没有修改就返回304,浏览器直接浏览本地缓存文件。否则服务器返回新内容。
b.彻底缓存:cache-control,Expires
通过Expires设置缓存失效时间,在失效之前不需要再跟服务器请求交互。
2、离线存储为整个web提供服务,浏览器缓存只缓存单个页面;
3、离线存储可以指定需要缓存的文件和哪些文件只能在线浏览,浏览器缓存无法指定;
4、离线存储可以动态通知用户进行更新。
二、如何实现
离线存储是通过manifest文件来管理的,需要服务器端的支持,不同的服务器开启支持的方式也是不同的。
1 2 3 4 5 6 7 8 9 10 | 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属性,如下:
1 | < span style = "color: #0000ff;" ><!</ span >< span style = "color: #ff00ff;" >DOCTYPE HTML</ span >< span style = "color: #0000ff;" >></ span >< br >< span style = "color: #0000ff;" ><</ span >< span style = "color: #800000;" >html </ span >< span style = "color: #ff0000;" >< a href = "http://www.php.cn/java/java-ymp-Lang.html" target = "_blank" >lang</ a ></ span >< span style = "color: #0000ff;" >="en"</ span >< span style = "color: #ff0000;" > manifest</ span >< span style = "color: #0000ff;" >='test.manifest'</ span >< span style = "color: #0000ff;" >></ span >< br >< span style = "color: #0000ff;" ><</ span >< span style = "color: #800000;" >< a href = "http://www.php.cn/html/html-HEAD-2.html" target = "_blank" >head</ a ></ span >< span style = "color: #0000ff;" >></ span >< br >< span style = "color: #0000ff;" ><</ span >< span style = "color: #800000;" >meta </ span >< span style = "color: #ff0000;" >char< a href = "http://www.php.cn/code/8209.html" target = "_blank" >set</ a ></ span >< span style = "color: #0000ff;" >="UTF-8"</ span >< span style = "color: #0000ff;" >></ span >< br >< span style = "color: #0000ff;" ><</ span >< span style = "color: #800000;" >title</ span >< span style = "color: #0000ff;" >></</ span >< span style = "color: #800000;" >title</ span >< span style = "color: #0000ff;" >></ span >< br >< span style = "color: #0000ff;" ></</ span >< span style = "color: #800000;" >head</ span >< span style = "color: #0000ff;" >></ span >< br >< span style = "color: #0000ff;" ><</ span >< span style = "color: #800000;" >body</ span >< span style = "color: #0000ff;" >></ span >< br >< br >< span style = "color: #0000ff;" ></</ span >< span style = "color: #800000;" >body</ span >< span style = "color: #0000ff;" >></ span >< br >< span style = "color: #0000ff;" ></</ span >< span style = "color: #800000;" >html</ span >< span style = "color: #0000ff;" >></ span >
|
最后别忘了,这些应用需要服务器支持。
Apache服务器开启支持的方式是:在conf/mime.types中添加一段代码:
1 | test/cache-manifest manifest
|
IIS服务器开启方式:
右键--HTTP---MIME映射下,单击文件类型---新建---扩展名输入manifest,类型中输入test/cache-manifest
三、通过JS动态控制更新
applicationCache对象提供个了一些方法和事件,管理离线存储的交互过程。通过在firefox8.0的控制台中输入window.applicationCache可以看到这个对象的所
有属性和事件方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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(){
//其他和离线存储有关的错误
}
|
四、浏览器与服务器的交互
曾经有面试题是这样的:"描述在浏览器的地址栏中输入:www.baidu.com 后发生了什么?"。
1、服务端返回baidu页面资源,浏览器载入html
2、浏览器开始解析
3、发现link,发送请求载入css文件
4、浏览器渲染页面
5、发现图片,发送请求载入图片,并重新渲染
6、发送请求js文件,阻塞渲染。如果js对dom进行了操作,则会进行rerender
对于支持离线存储的页面,浏览器和服务器的交互又是如何呢?
首次载入页面:
1-6 : 同上
7:请求页面中需要缓存的页面和数据,就算在之前的步骤中已经请求过(这是个耗能的地方)
8:服务器返回所有请求文件,浏览器进行本地存储
再次载入页面:
1:发送请求
2:使用本地存储的离线文件
3:解析页面
4:请求服务端的manifest文件,判断是否有改变,返回304则表示没有改变进入步骤5,否则进入步骤6
5:进入首次载入页面的7-8
6:使用本地存储,不重新请求
以上就是html5离线应用application cache的代码详解的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
HTML5中的常见错误用法
HTML5手机端页面缩放问题的解决详解
h5怎样实现获取用户地理定位
HTML5语义化标签有哪些
HTML5 video视频字幕的使用和制作方法
在webstorm中使用h5的快捷键
分享一个简单的HTML5 视频嵌入实例代码
HTML5互联网:地铁行业新模式
前端必看h5 meta小结
如何用HTML5在页面中插入可自动播放的视频
更多相关阅读请进入《HTML5》频道 >>
人民邮电出版社
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者
转载请注明出处:木庄网络博客 » html5离线应用application cache的代码详解