今天说说HTML5的新特性之一:离线应用缓存。
离线应用,就是在没有网络的情况下访问Web应用程序时,实际上是访问已下载的离线文件资源,并使得Web应用程序正常运行。
特性
开发者需要注意三个特性:
1. 离线资源缓存
在开发离线应用时,必须使用一种方案来说明哪些文件资源需要在离线状态下工作。当设备处于在线状态下,被指定缓存的资源文件便会缓存到本地。此后,如果用户在离线状态下再次访问该Web应用程序,浏览器就会自动加载本地资源,使得用户能够正常使用该Web应用程序。离线应用将使用manifest类型的文件作为需要配置缓存资源文件的配置文件。
2. ApplicationCache对象缓存状态
ApplicationCache对象记录着Web应用程序的缓存状态,开发者可以通过该缓存状态手动更新资源文件的缓存。
3. 在线状态检测
HTML5标准提供了onLine方法用于检测当前网络是否在线。
实例
下面说说具体如何实现缓存资源文件。
首先,将一个页面标为离线存储页面,需要给html标签绑定一个manifest属性指向离线配置文件:
<code class="hljs xml has-numbering"><span class="hljs-doctype"><!doctype html></span> <span class="hljs-tag"><<span class="hljs-title">html</span> <span class="hljs-attribute">manifest</span>=<span class="hljs-value">"test.manifest"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/cache-manifest"</span>></span> <span class="hljs-tag"><<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">meta</span> <span class="hljs-attribute">charset</span>=<span class="hljs-value">"UTF-8"</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>Document<span class="hljs-tag"></<span class="hljs-title">title</span>></span> <span class="hljs-tag"><<span class="hljs-title">link</span> <span class="hljs-attribute">rel</span>=<span class="hljs-value">"stylesheet"</span> <span class="hljs-attribute">href</span>=<span class="hljs-value">"css/a.css"</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">"js/a.js"</span>></span><span class="javascript"></span><span class="hljs-tag"></<span class="hljs-title">script</span>></span> <span class="hljs-tag"><<span class="hljs-title">script</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">"js/b.js"</span>></span><span class="javascript"></span><span class="hljs-tag"></<span class="hljs-title">script</span>></span> <span class="hljs-tag"></<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span> <span class="hljs-tag"></<span class="hljs-title">html</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>
test.manifest文件内容如下:
<code class="hljs avrasm has-numbering">CACHE MANIFEST <span class="hljs-preprocessor">#v0.1.0</span> <span class="hljs-label">CACHE:</span> js/a<span class="hljs-preprocessor">.js</span> css/a<span class="hljs-preprocessor">.css</span> <span class="hljs-label">NETWORK:</span> js/b<span class="hljs-preprocessor">.js</span> <span class="hljs-label">FALLBACK:</span> <span class="hljs-number">404.</span>html</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>
其中第一行的CACHE MANIFEST是必须要的标识
v是版本号
CACHE是要缓存的文件
NETWORK是不需要缓存的文件
FALLBACK是如果找不到文件,替换出现的文件
第一次加载页面:
第二次加载后可以看到只有b.js一个文件更新了,而其他文件都是从缓存中读取的。
可以通过开发者工具查询离线缓存:
在更新了资源之后,新的资源需要等到下次再打开app才会生效,如果需要资源马上就能生效,那么可以使用window.applicationCache.swapCache()方法来使之生效,出现这种现象的原因的浏览器会先使用离线资源加载页面,然后再去检测mainfest是否有更新,所以需要下次打开页面才能生效。