`
superxielei
  • 浏览: 263170 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

HTML5 缓存: CACHE MANIFEST

阅读更多

 

自从翻译了《解读 HTML5:建议、技巧和技术》,就一直没有时间去看 HTML5 相关的东西。上周一次偶然的工作间隙折腾了下 Cache Manifest 。当时直接拿博客当测试环境,虽然应用起来非常简单,但效果却出奇的好。缓存后的速度,简直是惊人的快。像 Yslow 显示,打开一个缓存过的页面,只要0.729秒,比不缓存的差不多快了10倍,当时就震惊了,想深入了解一下。

 一、什么是 Cache Manifest

话说,作为一个 web 开发相关的人员,都不会少听到、看到 cache 这个词。是的,上面也已经说了,它是一种缓存的机制。它可以通过一个 .manifest 文件来配置需要缓存的或者一定要保持联网缓存的文件。而重点就是这个 .manifest 文件,具体的可以 Google 一下,而简单的我帮你整理一下现在可能会希望了解的东西:

 

  • MIME TYPE:text/cache-manifest
  • 需要由你创建的:NAME.manifest
  • 作用:主要是配置需要缓存的文件

二、如何实现

实现起来倒是非常简单(当然,这也是有问题的,这个我们后面讲解决方案),实现步骤如下:

  1. 在服务器上添加MIME TYPE支:

    比如 Apache 中可在 .htaccess 中添加:

    AddType text/cache-manifest manifest
  2. 创建 NAME.manifest:

    其中第一行的 CACHE MANIFEST 标识是一定要有的,而 CACHE / NETWORK / FACKBACK 都是可选的。如果没有写标识,则默认缓存,CACHE 就不用说了,缓存;NETWORK 指不想缓存的页面,比如登陆页等;FALLBACK 是指当没有响应时的替代方案,比如我想请求某个页面,但这个页面的服务器挂了,那么,我可以显示另外一个指定的页面,文件结构如下:

    CACHE MANIFEST
    
    # VERSION 0.3
    
    # 直接缓存的文件
    CACHE:
    abc.html
    images/sofish.png
    js/main.js
    css/layout.css
    
    # 需要在时间在线的文件
    NETWORK:
    /wp-admin/
    
    # 替代方案
    FALLBACK:
    /ajax/ ajax.html
    

    至于如何更新这个配置文件?只要改变文件的内容即可,上面的 # VERSION 0.3 其实只是一行注释,但改变文件可以重新缓存,这样写上版本号,想更新的时候修改版本号来重新缓存,是一种比较推荐的方法,甚至可以是最佳实践。

  3. 给 <html> 标签加 manifest 属性
    <html manifest="path/to/NAME.manifest">

是的,就是如此简单,相信你花上30分钟也就了解了。当时我也这样。随后也很快地应用上去。结果。结果就是像这篇文章一样还没写完,但没有时间折腾,而是速速把它撤下,等问题解决后再应用。

三、Cache Manifest 存在的问题

经过上面一整,速度当然爽,帮忙测试的人也小震惊了一下,只是,还是存在一些问题,看一下,然后我们尝试解决:

  1. 自动缓存引用了 manifest 文件的页面

    即使在 NETWORK 中指定 "*"(所有的页面都)使用网络,还是不能解决它自动缓存当前页面。这使得这个页面在 manifest 没有变更的情况下,会一直以"类静态"存在。比如,你后台更新了一篇文章,这个动态的首页,还是像第一次缓存的时候一样,没有变。这对于静态页面还好,但应用在一个动态系统就很麻烦了,因为你的内容是时时要更新的。

  2. Firefox 弹出提示信息

    可能是习惯了弹窗警告之类的,一不小心,用户还以为是网站被人挂马呢,想把不干净的东西存储到他的电脑。


四、解决方案

一)关于自动缓存当前页面

我查了 w3c 的文档,也看了 《Pro HTML5 Programming》的第10章(Creating HTML5 Offline Web Applications),最后还是 div into HTML5 的那句话,原意大概是:这并不是 Bug,而是机制的需要。

真是杯具,反正我能理解到的是,这是一种强加的功能。虽然说这样会让页面载入更快,但对于动态页面来说就是恶心了。至少应该有一种让用户选择是否缓存当前页的配置方案(或者说是一个开关)。不过,这是暂时不能解决的,毕竟这还只是一个 Draft,我们要用,就应用找一个合适的方案。

我的想法是,看看大家有没有更好的办法。结果,查了一下,无果。新的东西,几乎所有文章说的都只是我上面说的那个如何去写一个 manifest 文件,看来还是没办法偷懒。然后,便开始想:

  1. 一定不要缓存动态的页面,当前页一定不能引用 manifest文件
  2. 能不能从其他页面先载入缓存?

那么,如果有解决方案的话,解决方法应该是

  1. 不在当前页面引用 manifest
  2. 在用户打开页面之前,需要有一个页面来实现缓存机制

如果这样,那么为何不试一下 iframe 来引入一个拥有 manifest 的静态文件?但用 iframe 还能会缓存到文件?经过一翻测试,Google Chrome 的调试工具给了答案:


太给力啦!!竟然成功缓存。做法是这样的,新建一个 cache.html 文件来当做为当前页面的代理,内容如下:

<!DOCTYPE html>
<html  manifest="http://www.sofish.de/sofished.manifest">
<head>
        <meta charset=utf-8 />
        <title>cache</title>
</head>
<body>
hi sofish!
</body>
</html>

然后,在每个页面通过 iframe 来引用这个静态文件,以达到我们不缓存当面页面,只缓存我们希望缓存文件的目的。

(二)关于 Firefox 弹出警告问题

这个,浏览器默认的,浏览器厂商的目的是为用户的安全着想,我们暂时也改变不了。其实,也不会有太大的影响,我也没有好好去想。

五、总结

测试下来,其实跟缓存当前页面还是有差别的,毕竟像站外的链接,特别是 gravatar 总要请求这么多图片,这点就又多了一点时间了。这现象主要出现在 Firefox 下,而 Webkit 而表示非常棒,速度几乎和缓存当前面一样,第二次打开的页面,都是瞬间响应的, 这点不得不赞啊。

对于实践的 Demo,本来可以提供一份,不过,瞄了一下,突然发现自己写得太专心了,已凌晨 2:49 了,明天还要上班。所以,打开你的调试工具,把本博当 Demo 看吧,这是最直接的应用了。

好吧,大概就这样,能为用户省多少就是多少,这是一个前端希望做到的,也是能做到的。这也算是有了 fallback 方案。期待你,看到最后的你,还有更好的方法。也期待 HTML5 的发展,期待这些给力的新技术。

原文地址:HTTP://SOFISH.DE/1449

 

  • 大小: 2.6 KB
  • 大小: 20.6 KB
  • 大小: 32.3 KB
分享到:
评论

相关推荐

    Html5应用程序缓存(Cache manifest)

    主要介绍了Html5应用程序缓存(Cache manifest)的相关资料,可以优化加载速度,节约服务器资源。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    cache manifest本地存储实际应用demo

    应用程序缓存三个优点: 1,离线浏览 - 用户可在应用离线时使用它们 2,速度 - 已缓存资源加载得更快 ...1,Cache Manifest(缓存清单)基础 如需启用应用程序缓存,请在文档的 &lt;html&gt; 标签中包含 manifest 属性:

    html5-cache-manifest-servlet:Servlet 用于自动生成 cache.manifest(HTML5 中的离线模式)文件并在缓存资源更改时更新它

    缓存清单 Servlet介绍HTML5 提供了很棒的功能此功能基于cache.manifest文件,浏览器使用该文件来确定应在离线模式下访问哪些资源。 每次打开页面浏览器时,都使用页面和资源的缓存版本,但是在后台检查cache....

    HTML5 Application Cache 应用程序缓存

    !!!!!服务器需要添加配置!!!!!!!!! 建议使用Google Chrome 测试 我的是Apache服务器 conf/httpd.conf 文件的mime_module 中添加 . . . AddType text/cache-manifest .appcache &lt;/IfModule&gt;

    详解HTML5中的manifest缓存使用

    起源html5之前的网页,都是无连接,必须联网才能访问,这其实也是web的特色,这其实对于PC是时代...什么是Cache Manifest首先manifest是一个后缀名为minifest的文件,在文件中定义那些需要缓存的文件,支持manifest的

    HTML5 manifest离线缓存的示例代码

    HTML5 使用 ApplicationCache 接口解决了由离线带来的部分难题。 使用缓存接口可为您的应用带来以下三个优势: 离线浏览 – 用户可在离线时浏览您的完整网站 速度 – 缓存资源为本地资源,因此加载速度较快。 ...

    HTML5 应用程序缓存

    使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时...

    html5应用缓存_动力节点Java学院整理

    HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用。 Application Cache带来的三个优势是: ① 离线浏览 ② 提升页面载入速度...

    使用 HTML5 开发离线应用

    为了能够让用户在离线状态下继续访问 Web 应用,开发者需要提供一个 cache manifest 文件。...本节先通过一个例子展示 cache manifest 文件的用途,然后详细描述其书写方法,最后说明缓存的更新方式

    Application Cache未缓存文件无法访问无法加载问题

    使用Application Cache缓存了页面及静态资源,发现用ajax请求数据,或者加载未缓存的资源时,无法加载,报错如下: CAUTION:Provisional headers are shown, 解决方法: manifest.appcache配置文件中NETWORK:...

    webext-storage-cache:WebExtensions模块

    webext-storage-cache WebExtensions模块:具有到期时间的类似地图的承诺缓存存储。 Chrome和Firefox。 该模块适用于内容脚本,背景页面和选项页面。 安装 您可以下载并将其包含在manifest.json 。 或使用npm : ...

    html5 offlline 缓存使用示例

    复制代码代码如下: &lt;mime&gt; &lt;extension&gt;manifest&lt;/extension&gt; &lt;mime&gt;text/cache-manifest&lt;/mime&gt; &lt;/mime&gt; 尤其注意,extension的value是manifest,所以以后配置缓存文件的后缀必须跟他一样。 使用缓存是必须如下...

    HTML5程序设计(第2版).[荷]Peter Lubbers(带详细书签).pdf

    《深入HTML5编程(第 2版)》首先介绍了HTML5的历史背景、新的语义标签及与以往HTML版本相比的根本变化,同时揭示了HTML5背后的设计原理。本书在上一版的基础上新增了SVG和拖放API相关内容,并对部分内容进行了更新。...

    offline-bootstrap:简易HTML5离线缓存

    HTML5离线缓存引导程序 使您的客户端Web应用轻松脱机加载。 我最近有几个完全是客户端Web应用程序的项目( 和 )。 因此,应该可以离线运行它们。 幸运的是, 允许用户在加载特定URL所需的文件。 不幸的是,要使这...

    从入门到精通HTML5——PDF——网盘链接

     2.3.9 禁止从缓存中调用 24  2.3.10 删除过期的cookie 25  2.3.11 强制打开新窗口 25  2.3.12 设置网页的过渡效果 26  2.4 基底网址标记&lt;base&gt; 29  2.5 页面的主体标记&lt;body&gt; 30  2.5.1 设置...

    offlineApplictaion:HTML5离线应用

    HTML5离线应用###一、离线应用的特点和优势(1)允许web应用程序将app保存在...空行被忽略,注释以#开始清单文件的后缀名一般是.appcache同时需要设置Content-Type的头信息为text/cache-manifest才会有离线缓存,

    google-api-services-mirror-v1-rev21-1.15.0-rc.zip

    cachemanifest-maven-plugin.zip,在生成时生成缓存清单文件(用于脱机缓存,HTML5脱机模式),给定要包含/排除的文件模式。这个插件最初是由glenn barrett在github.com/cantinac/cachemanifest-maven-plugin上创建的...

Global site tag (gtag.js) - Google Analytics