澳门新浦京电子游戏html5的离线存储的研究(1)——appcache

什么是Application Cache

HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache
manifest文件,可以轻松的创建离线应用。

Application Cache带来的三个优势是:

① 离线浏览

② 提升页面载入速度

③ 降低服务器压力

而且主要浏览器皆以支持Application
Cache,就算不支持也不会对程序造成什么影响

前几天因为维护的一个vue移动端项目,出现了一个问题,在ios
webview下,无论怎么修改都没有更新,后来排查了下原因。是缓存的问题,使用webpack后在每一个js文件后加上了一个hash值。通过这一次的排查,让我对html5的缓存,引发了极大的兴趣。通过网上的查找,我发现,html5的缓存技术新增了有以下两种,一种是localstorage,还有一种是appcache。传统的还有一种是cookie。localstorage的话已经是很熟悉了,在项目中也经常熟练地使用setItem和getItem方法。至于这个appcache不是很熟悉。

atitit.提升性能AppCache

离线存储技术

HTML5提出了两大离线存储技术:localstorage与Application
Cache,两者各有应用场景;传统还有离线存储技术为Cookie。

经过实践我们任务localstorage应该存储一些非关键性ajax数据,做锦上添花的事情;

Application Cache用于存储静态资源,仍然是干锦上添花的事情;

而cookie只能保存一小段文本(4096字节);所以不能存储大数据,这是cookie与上述缓存技术的差异之一,而因为HTTP是无状态的,服务器为了区分请求是否来源于同一个服务器,需要一个标识字符串,而这个任务就是cookie完成的,这一段文本每次都会在服务器与浏览器之间传递,以验证用户的权限。

所以Application Cache的应用场景不一样,所以使用也不一致。

HTML5引入了这项技术,意味着web应用可进行缓存,并在没有网络的情况下使用。Application
Cache带来的三个优势是:

 

Application Cache简介

Application Cache的使用要做两方面的工作:

① 服务器端需要维护一个manifest清单

② 浏览器上只需要一个简单的设置即可

<html  manifest="demo.appcache">

以例子做说明:

CACHE MANIFEST

CACHE:
# 需要缓存的列表
style1.css
1.jpg
01.js

http://localhost/applicationcache/02.js


http://localhost/applicationcache/zepto.js

NETWORK:
# 不需要缓存的
4.jpg

FALLBACK:
# 访问缓存失败后,备用访问的资源,第一个是访问源,第二个是替换文件*.html /offline.html
2.jpg/3.jpg

首先我这里报了一个错:

 Application Cache Error event: Manifest fetch failed (404)

这个错误的原因是:manifest 文件需要配置正确的 MIME-type,即
“text/cache-manifest”。必须在 web 服务器上进行配置,不同的服务器不一样

澳门新浦京电子游戏 1

APPLICATIONCACHE
    01.js
    02.js
    1.jpg
    2.jpg
    3.jpg
    4.jpg
    demo.appcache
    index.html
    style1.css
    style2.css
    web.config
    zepto.js

这样一来便可以离线应用了,这个时候就算断网了,那些文件依旧能访问

澳门新浦京电子游戏 2

这里有一点值得注意,比如这里不带/index.html他会将“applicationcache/”缓存,其实这个就是index.html

manifest 文件可分为三个部分:
CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存
NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓存
FALLBACK - 在此标题下列出的文件规定当页面无法访问时的回退页面(比如 404 页面)

澳门新浦京电子游戏 3

如图所示,HTML5定义了几个事件点,但是我们一般不会主动使用js去操作什么,大多数情况下,我们完全依赖浏览器的处理即可。

  1. 离线浏览

  2. 提升页面载入速度

  3. 降低服务器压力

1.1.
起源1

尺寸限制

Application Cache的尺寸限制统一在5M,我这里做一个测试:

澳门新浦京电子游戏 4

如所示,两个css文件依旧超过了5M这个时候

Document was loaded from Application Cache with manifest http://localhost/applicationcache/demo.appcache
index.html:1 Application Cache Checking event
index.html:6 GET http://localhost/applicationcache/style2.css net::ERR_FAILED
index.html:1 Application Cache NoUpdate event
index.html:11 GET http://localhost/applicationcache/2.jpg net::ERR_FAILED
index.html:12 GET http://localhost/applicationcache/3.jpg net::ERR_FAILED

如所示,style2已经不能缓存了,这个会造成什么问题呢?

比如我A频道维护了自己的Application
Cache,B频道也维护了自己的,这个时候A频道如果使用达到了一个峰值,会导致B频道所有的缓存失效,所以:

建议Application Cache,存储公共资源,不要存储业务资源

一些问题

由更新机制来说,首次更新manifest时,因为页面加载已经开始甚至已经完成,缓存更新尚未完成,浏览器仍然会使用过期的资源;浏览器是当Application
Cache有更新时,该次不会使用新资源,第二次才会使用。这个时候update事件中执行window.reload事件。

window.applicationCache.addEventListener("updateready", function(){
    window.location.reload()
});

由上例可以知道,缓存的不只是显示定义的文件,比如上例中的applicationcache/时便会默认保存index.html为映射的数据,并且包含demo.appcache文件,很多时候会遇到一次文件更新线上老是不更新,这个时候随便在manifest配置文件中做一点修改即可更新。

比如我们将这里代码做一个改变:

<html  manifest="demo.appcache">
=>
<html  manifest="demo1.appcache">

这个时候如果不做demo.appcache的更新的话,缓存将不会更新,原因是index.html被缓存了,检测的仍然是原manifest清单

各个页面统一管理自己的manifest清单,意思是a页面配置了common.js,b页面也配置了common.js,意思是a页面更新后,b页面的manifest不更改的话,b页面依旧读取的是老版本的文件,这个有一定道理却也有一定浪费,需要公共页面做处理。

而且主要浏览器皆以支持Application
Cache,就算不支持也不会对程序造成什么影响

2. 离线存储2

总结

从可用性与易用性来说,Application
Cache是值得使用的,但是最好是做静态资源的缓存,真正要实现离线应用还得花更多的功夫呢!

参考:

使用

使用appcache的话,需要在index.html下,也就是项目目录下,新建一个类似于cache.manifest的manifest文件并在index.html下的html标签内新增manifest属性

<!DOCTYPE HTML><html manifest = "cache.manifest">...</html>

总结一下就是在html中引入一个minifest的文件,该文件声明了哪些文件应该被缓存,哪些文件不会被缓存格式如下

CACHE MANIFEST#v0.11 首次下载后进行缓存的,一般会写版本号CACHE:#需要被缓存的文件js/app.jscss/style.cssNETWORK:#不需要被缓存的文件resourse/logo.pngFALLBACK:#表示如果访问第一个资源失败,那么就使用第二个资源来替换他,比如上面这个文件表示的就是如果访问根目录下任何一个资源失败了,那么就去访问offline.html。/ /offline.html

1.在cache.manifest下应当写明版本号,并且对本文件不做缓存处理,因为如果服务器对离线资源进行了更新,那么必须更新manifest文件之后这些资源才能被浏览器重新下载,如果只是更新了资源而没有更新manifest文件的话,浏览器并不会重新下载资源,也就是说还是使用原来离线存储的资源。2.如果服务器资源更新了,那么浏览器会一次性下载所有更新资源,如果下载过程中失败,那么这次所有更新都算是失败的。浏览器还会使用以前的资源。

  1. 浏览器会先使用离线资源加载页面,然后再去检查manifest是否有更新,所以需要到下次打开页面才能生效。

从可用性与易用性来说,Application
Cache是最好是做静态的公共资源的缓存,尽量不去缓存业务资源。感觉离真正的缓存之路还是比较遥远的。

以前查的资料都是大牛以前的博客上看来的,这一次为了看一些api去mdn上观看了官方的解释

已废弃该特性已经从 Web
标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。

在此刻使用这里描述的应用程序缓存功能高度不鼓励;
它正在处于从Web平台中被删除的过程。请改用Service Workers
代替。事实上,在Firefox
44中,当AppCache用于为页面提供离线支持时,控制台中现在显示一条警告消息,建议开发人员改用
Service workers 代替 (bug 1204581)。所以,尽量不使用啦!

3. AppCache2

3.1. Appcache事件点如图2

3.2.
Manifest文件4

3.3.
自动化工具4

3.3.1.
CACHE:(必须)5

3.4.
页面都离线了,ajax 更新5

3.5.
页面的参数如何携带使用js解析6

3.6. 离线页面的更新  长尾问题6

3.7. 如何更新缓存7

3.8.
注意事项8

 

1.1. 起源

html5之前的网页,都是无连接,必须联网才能访问,这其实也是web的特色,这其实对于PC是时代问题并不大,但到了移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐在火车上,过了一个隧道(15分钟),便无法访问网站,这对于web的伤害是很大的,比如对于
《ecmascript合集》这样的为阅读而生的页面。

html5便引入了cache
manifest 文件。那么什么是cache manifest呢,接下来会讲到。

 

2. 离线存储

工作中实际使用的离线缓存有localstorage与Application cache,这两个皆是好东西,一个常用于ajax请求缓存,一个常用于静态资源缓存,这里简单说下我的一些理解

离线存储技术

HTML5提出了两大离线存储技术:localstorage与Application Cache,两者各有应用场景;传统还有离线存储技术为Cookie。

经过实践我们认为localstorage应该存储一些非关键性ajax数据,做锦上添花的事情;

Application
Cache用于存储静态资源,仍然是干锦上添花的事情;

 

作者::  ★(attilax)>>>   绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: 

 

3. AppCache

注意:
主页一定会被缓存起来的,因为AppCache主要是用来做离线应用的,如果主页不缓存就无法离线插件了,因此把index.html添加到NETWORK中是不起效果的。

 

AppCache文件里面儿

 不必明确列出AppCache链接到的页面,因为在默认情况下,任何包含html元素manifest属性的页面都会缓存,这些自动缓存的页面称为主条目,而清单中列出的文件称为详细条目,如果某些文件需要在线访问,,则可以创建一种文件白名单,如果将它们列于NETWORK;之后,这些文件就总可以通过网络加载,这些文件称为网络条目.

使用Application cache可以提升网站载入速度,主要体现在请求传输上,把一些http请求转为本地读取,有效地降低网络延迟,降低http请求,使用简单,还节约流量何乐而不为

 

 

另外要做好对manifest文件的管理,由于清单内文件不可访问或manifest更新不及时造成的一些问题。

 

html新增了一个manifest属性,可以用来指定当前页面的manifest文件

 

3.1. Appcache事件点如图

3.2. Manifest文件

接下来详细说说manifest的细节,一个典型的manifest文件代码结构像下面这样:

CACHE
MANIFEST#version 1.3CACHE:    test.cssNETWORK:*

manifest文件,基本格式为三段:
CACHE, NETWORK,与 FALLBACK,其中NETWORK和FALLBACK为可选项。

而第一行CACHE
MANIFEST为固定格式,必须写在前面。

以#号开头的是注释,一般会在第二行写个版本号,用来在缓存的文件更新时,更改manifest的作用,可以是版本号,时间戳或者md5码等等。

 

关于manifest.

首先
manifest 的 contentType
= text/cache-manifest

然后,其扩展名,建议为
appcache”

 

3.3. 自动化工具

manifest文件中的cache部分不能使用通配符,必须手动指定,这实在太让人不可理解,文件一多,就成了体力活了

 

3.3.1. CACHE:(必须)

标识出哪些文件需要缓存,可以是相对路径也可以是绝对路径。

a.css

NETWORK:(可选)

这一部分是要绕过缓存直接读取的文件,可以使用通配符*。

下面的代码
“login.asp” 永远不会被缓存,且离线时是不可用的:

NETWORK:login.asp

FALLBACK:(可选)

指定了一个后备页面,当资源无法访问时,浏览器会使用该页面。该段落的每条记录都列出两个
URI—第一个表示资源,第二个表示后备页面。两个 URI
都必须使用相对路径并且与清单文件同源。可以使用通配符。

下面的例子中,如果无法建立因特网连接,则用
“404.html” 替代 /html5/ 目录中的所有文件。

FALLBACK:/html5/
/404.html

下面的例子中,则用
“404.html” 替代所有文件。

FALLBACK:*.html
/404.html

 

3.4. 页面都离线了,ajax 更新

A. 首先,你可以修改下 manifest 文件来更新这个页面,这个我就不介绍了,但是作为文章内容 页面离线以后,就会存储在本地了,如果你是一篇文章的话,那么这个文章的内容页就被存下来了,你如果以相同的 url 去访问,不管你文章里面的数据更新没有,这个离线下来的页面都不会更新了 ( 除非你更新manifest 文件 ) 。所以,所有的动态数据,你都得用 ajax 方式去获取,就像客户端一样,离线的页面应该是一个没有数据的 空壳,然后通过 ajax 去拉去数据填补这个空壳。然后要注意的是, ajax 的请求地址,要写到 manifest 的 network 中,要不然,你可以试试。

3.5. 页面的参数如何携带使用js解析

比如 m.baidu.com/app?a=1&b=2 ,通常我们用一些参数来标记这个页面,通过参数来渲染页面内容,但是 manifest 对于上面的方式,会认为不同的参数表示不同的页面。如果你吧内容页做成一

 

 

3.6. 离线页面的更新  长尾问题

网站更新了,如果更新用户本地的离线页面呢?与很多文章中说的一样,先上线你的文件,然后修改一下页面中引入的cache.manifest文件即可,比如修改下注释,修改后,如果再访问页面,就会先去校验manifest 时候有更新,如有更新,再次刷新页面的时候,页面就会更新了。

A.长尾问题, 就像前面说到的一样,如果你的 manifest 文件更新了,你访问页面,需要刷新一次,更新的页面才能 load 进来,那么这样就有一个问题,如果你的后端数据,就是给 js ajax 接口的数据变化了,你对应的 js 也修改了。那么你修改 manifest 上线的时候,第一次开页面,页面就会 bug 了。再刷一次页面,就好了。那么,这个第一次访问的 bug ,是我们不想看到的。而且你不能知道用户什么时候第二次再来访问你的页面,所以你的页面一旦使用 manifest 离线,就像客户端一样,这样就出现了长尾问题。还好, manifest 有一些 js 接口,可以来判断, load 更新文件。

B.刷新页面

copy 了 api 一段代码:

1. 1 当前文档对应的 applicationCache 对象 

2. window.applicationCache

3. 2 cache.status 属性 , 返回当前离线应用的状态

4.  
     UNCACHED ( 数值 0) :未启用离线应用

5.  
   
 IDLE ( 数值 1) :已开启离线应用,但本地缓存的资源是最新的,并且未标记为废弃资源

6.  
     CHECKING ( 数值 2) :当前更新缓存的状态为 “ 检查中 ”

7.  
     DOWNLOADING ( 数值 3) :当前更新缓存的状态为 “ 下载资源中 ”

8.  
     UPDATEREADY ( 数值 4) :当前更新缓存的状态为 “ 更新完毕 ”

9.  
   
 OBSOLETE ( 数值 5) :已开启离线应用,但缓存资源都已标记为废弃

3.7. 如何更新缓存

如下三种方式,可以更新缓存:

· 

更新manifest文件

· 

· 

通过javascript操作

· 

· 

清除浏览器缓存

· 

给manifest添加或删除文件,都可更新缓存,如果我们更改了js,而没有新增或删除,前面例子中注释中的版本号,可以很好的用来更新manifest文件。

html5中引入了js操作离线缓存的方法,下面的js可以手动更新本地缓存。

window.applicationCache.update();

如果用户清除了浏览器缓存(手动或用其他一些工具)都会重新下载文件。

3.8. 注意事项

· 

浏览器对缓存数据的容量限制可能不太一样(某些浏览器设置的限制是每个站点
5MB)。

· 

· 

如果manifest文件,或者内部列举的某一个文件不能正常下载,整个更新过程都将失败,浏览器继续全部使用老的缓存。

· 

· 

引用manifest的html必须与manifest文件同源,在同一个域下。

· 

· 

FALLBACK中的资源必须和manifest文件同源。

· 

· 

当一个资源被缓存后,该浏览器直接请求这个绝对路径也会访问缓存中的资源。

· 

· 

站点中的其他页面即使没有设置manifest属性,请求的资源如果在缓存中也从缓存中访问。

· 

· 

当manifest文件发生改变时,资源请求本身也会触发更新

 

 
 
1.
标准鼓励,缓存包含manifest清单的页面,所以实际上,即使我们不显示的把包含manifest的页面,列在manifest缓存清单中,这个页面也会被缓存的.

 
   2. HTTP相关的缓存头域 以及 https的缓存页面限制,将被manifest所无视.
所以在用户代理 更新页面之前,它是不会过期的.
也就是说,即使是一个HTTPS的东西.也可以脱机工作.

 

 

参考

HTML5
AppCache机制分析 – liqinghua1653的专栏 – 博客频道 – CSDN.NET.html

慎用manifest – 推酷.html

HTML5应用程序缓存Application Cache – 叶小钗 – 博客园.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注