Manifest是用来做离线页面的,即使断网也能正常打开页面,用起来简单,但是在实际使用中存在以下问题:

(1)如何自动缓存所有的页面的资源?因为manifest不能使用*通配符进行cache

(2)如果网站资源更新,怎么让manifest文件自动更新?不然如果用户不清缓存即使联网也会加载老页面

我觉得很多网站没有使用Manifest是因为上面提到的两个原因,有些人有尝试过,但使用起来比较麻烦,离线应用价值好像不太大。但是使用Manifest还是有很多好处的,特别是像博客等之类的偏向于展示的网站,或者是在线APP,这种网站的数据动态变化频率比较低,不需要频繁地向服务请求数据。这样当用户需要频繁退回首页或者频繁地在几个页面来回切换的时候,由于几乎所有资源都在本地,所以加载起来是瞬时的。

1. 使用Manifest

使用Manifest很简单,就是在html标签上加一个manifest属性:复制代码

这个属性指向一个manifest的文件,这个文件指明了当前页面哪些资源需要进行离线缓存,如下home.appcache:CACHE MANIFEST

#9/27/2017, 3:04:25 PM

#html

https://github.com/

#img

https://assets-cdn.github.com/images/modules/site/universe-octoshop.png

https://assets-cdn.github.com/images/modules/site/universe-wordmark.png

#css

https://assets-cdn.github.com/assets/frameworks-bedfc518345231565091.css

#js

https://assets-cdn.github.com/assets/compat-94eba6e3cd1fa18902d9.js

NETWORK:

*

FALLBACK

https://github.com/ /html/manifest/html/home.html复制代码

这个文件第一行必须以CACHE MANIFEST开头,否则浏览器解析会报错,注释使用#开头,在这一行下面跟着需要缓存的资源,接着的NETWORK表示哪些资源需要联网加载,一般需要写成NETWORK *,表示除了CACHE外的其它所有资源都需要联网,包括一些动态请求,如果你不是写的*,而是写了具体路径,那些既没有在CAHCE的,也没有在NETWORK的就会报加载失败的错误,如下所示:

即使联网也会这样,所以一般写成*。

FALLBACK表示替代资源,这些资源加载不到就替代加载哪些资源,如上面的文件https://github.com访问不了就使用一个静态的html访问:https://github.com/html/manifest/html/home.html。

打开支持Manifest的网站,例如www.rrfed.com,可以观察到Chrome控制台cache的过程:

然后再刷新页面,你会发现页面几乎所有资源都是在本地缓存取的,如下图所示:

并且你把网断了,刷新页面,页面依旧能够正常加载出来。这个在Chrome/Firefox/Safari等浏览器均支持。

除了Manifest之外,还有另外一个缓存的手段,就是设置HTTP报文头的Cache-Control字段进行缓存,这个可以缓存JS/CSS/图片资源,但是如果你把HTML也缓存了就会有一个问题,如果用户不清除缓存,即使你的页面更新了,用户仍然会加载老的页面,直到缓存设定Max-Age时间到了。所以用Manifest可以解决这个问题。

Manifest怎么知道当前页面数据更新了呢?只要把你把manifest文件如上面的home.appcache更改一下就可以了,浏览器打开页面时都会去加载这个文件,一旦发现这个文件发生了变化下次刷新的时候就会重新加载所有Cache的文件,最简单的可以把注释里的时间改成当前的时间就可以了:#9/29/2017, 9:08:49 AM复制代码

所以当网站的资源发生更改就可以改变这个manifest的内容,进而联网的浏览器就能进行更新。

使用Manifest需要注意以下问题:

(1)Manifest有大小限制,它其实也算本地存储,本地存储一般每个域有限制使用的空间,PC Chrome是5Mb,参考如下表格:BrowserApplication Cache (AppCache) Storage Limit

Safari Desktop (Mac & Win)Unlimited

Safari Mobile (iOS)10 MB

Chrome Desktop (Mac & Win)5 MB *

Chrome Mobile (Android)Unlimited **

Firefox 4 BetaUnlimited (with user prompt)

IENo idea. It sucks. ***

(2)Manifest文件如home.appcahce不能跨域,如果跨域需要支持CORS

(3)Manifest Cache的资源不能跨域,同样如果跨域该资源需要支持CORS,一般浏览器会自动处理

2. 解决Manifefst的自动生成和更新问题

由于Manifest不能使用通配符匹配资源,所以需要把要进行cache的资源一个个列出来,而网站的内容经常是动态更新的,所以这个就比较麻烦。为此笔者写了一个自动生成manifest的NPM包generate-manifest,用起来非常简单:npm install -g generate-manifest

generate-manifest --url=https://github.com复制代码

它就会生成一个home.appchache的Manifest文件,这个文件包括页面上的img/js/css的资源链接:CACHE MANIFEST

#9/27/2017, 3:04:25 PM

#html

https://github.com/

#img

https://assets-cdn.github.com/images/modules/site/universe-octoshop.png

https://assets-cdn.github.com/images/modules/site/universe-wordmark.png

#css

https://assets-cdn.github.com/assets/frameworks-bedfc518345498ab3204d330c1727cde7e733526a09cd7df6867f6a231565091.css

#js

https://assets-cdn.github.com/assets/compat-91f98c37fc84eac24836eec2567e9912742094369a04c4eba6e3cd1fa18902d9.js

NETWORK:

*

FALLBACK

https://github.com/ /html/manifest/html/home.html复制代码

这样就解决了自动生成的问题,自动更新应该怎么办呢?

由于我是一个博客网站,网站内容发生变化的地方主要有:1. 发表/更改博客; 2. 用户发表评论; 3. 网站的浏览量发生变化,第一个解决的方法写了一个接口,只要发表博客就调一下这个接口去生成一个新的manifest文件:https://www.rrfed.com/refresh-manifest.php?link=https://www.rrfed.com/2017/09/26/manifest/

然后就会调上面的generate-manifest的包,生成一个manifest.appcache的文件,在html里面是根据路径的最后一个部分决定manifest的名字:<?php

$uri = "$_SERVER[REQUEST_URI]";

$uriArray = explode("/", $uri);

$uriName = count($uriArray) > 2 ? $uriArray[count($uriArray) - 2] : "home";

?>

manifest=<?php echo "/html/manifest/appcache/$uriName.appcache"?>>复制代码

这个和生成的文件名一一对应。

第二个问题:用户发表评论——在调发表接口那里自动地调一下这个接口,需要注意的是这个接口需要防脚本注入,不然比较危险,

第三个问题:阅读量数据变化的——写一个Linux定时任务,使用crontab添加一个定时任务,执行crontab -e添加:0 3 * * * /home/fed/manifest/update-all.sh复制代码

上面的意思是每天3:00的时候跑一下update-all.sh这个脚本,这个脚本把所有页面的更新命令都写进去:generate-manifest --url=https://www.rrfed.com

generate-manifest --url=https://www.rrfed.com/page/2/

generate-manifest --url=https://www.rrfed.com/page/3/

#..其它...复制代码

第一点提到的发表文章,也会添加一行命令到这个脚本里面。

由于阅读量这个数据不是很重要,所以一天更新一次就好了。这样可以让用户在同一天的操作有缓存。如果第二天再来看的话就更新一下。

因此基本上就解决了自动更新的问题。

还有一个问题是,Manifest改了之后的第一次刷新还是老的页面,只有第二次刷新的时候才是对的,所以我们希望改了manifest之后能够一刷新就是新的,而不是之前缓存的那个,也不需要刷两次。

那么怎么办呢?Manifest有一个更新的事件,一旦manifest文件有更新就会触发这个事件,所以我们可以监听这个事件,然后自动刷新页面让页面重新加载就可以了,如下代码:function onUpdateReady(){

window.location.reload(true);

}

window.applicationCache.addEventListener('updateready', onUpdateReady);

if(window.applicationCache.status === window.applicationCache.UPDATEREADY) {

onUpdateReady();

}复制代码

综上,我们很好地利用Manifest做了一个离线页面应用,解决了自动生成和自动更新的问题。即使用户没有离线,第二次加载的资源都是在本地缓存的,所以当用户在几个页面来回切换的时候这个速度是很快的,如很多人可能会在主页的列表和内容页之间来回切换。

虽然Manifest已经被deprecated了,被Service Worker取代了,但是由于它的简单易用以及兼容性好,我们还是可以用一用。

相关阅读:

HTML5怎样设置站点,我是怎样让网站用上HTML5 Manifest相关推荐

  1. 如何让网站用上HTML5 Manifest

    Manifest是用来做离线页面的,即使断网也能正常打开页面,用起来简单,但是在实际使用中存在以下问题: (1)如何自动缓存所有的页面的资源?因为manifest不能使用*通配符进行cache (2) ...

  2. html manifest 不支持,如何让网站用上HTML5 Manifest

    Manifest是用来做离线页面的,即使断网也能正常打开页面,用起来简单,但是在实际使用中存在以下问题: (1)如何自动缓存所有的页面的资源?因为manifest不能使用*通配符进行cache (2) ...

  3. html5怎么设置表单居中显示图片,如何将html5中的图片设置居中?图片居中的代码!...

    在各种形形色色的网页中少不了的就是图片了,在使用和浏览的时候我们看到都是文字的话肯定是不好受的,那么这次就来说说如何将html5中的图片设置居中,下面是小编分享的一些有关于在 html5 中图片如何居 ...

  4. HTML5期末大作业:水果超市网站设计——水果超市(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 网购商城设置网页

    HTML5期末大作业:水果超市网站设计--水果超市(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 网购商城设置网页 常见网页设计作业题材有 个 ...

  5. HTML5期末大作业:动漫网站设计——迪斯尼公主(6个页面) HTML+CSS+JavaScript 动漫网页HTML代码 学生网页课程设计期末作业下载 动漫大学生网页设计制作成

    HTML5期末大作业:动漫网站设计--迪斯尼公主(6个页面) HTML+CSS+JavaScript 动漫网页HTML代码 学生网页课程设计期末作业下载 动漫大学生网页设计制作成 临近期末, 你还在为 ...

  6. HTML5期末大作业:网上花店网站设计——简约的网上花店网站设计(4页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码

    HTML5期末大作业:网上花店网站设计--简约的网上花店网站设计(4页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常见网 ...

  7. HTML5期末大作业:鲜花超市网站设计——鲜花超市(4页) HTML+CSS+JavaScript HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:鲜花超市网站设计--鲜花超市(4页) HTML+CSS+JavaScript HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 作品介绍 1.网页作品简介 ...

  8. 使用HTML5监測站点性能

    在这个信息爆炸的互联网时代,越来越多的人缺少了等待的耐心.站点性能对于一个站点来说越来越重要.下面为监控到的站点打开时间对跳出率的影响: 当站点打开时间在0-1秒时,跳出率为12% 当站点打开时间在1 ...

  9. 我是如何将网站全站启用Https的?-记录博客安装配置SSL证书全过程

    评论»   文章目录 为什么要Https 如何选择Https 安装部署SSL证书 平滑过渡Https 搜索引擎的响应 启用Https小结 正如大家所看到的,部落全站已经启用了Https访问了,连续几天 ...

最新文章

  1. Nginx与php的整合
  2. python学习:函数传参数
  3. BrainNet:用于人与人之间直接协作的多人脑对脑接口
  4. oracle sqlserver 存储过程,存储过程--oracle,sqlserver示例
  5. 【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 / 接口 方法 super )
  6. Windows中常用的git GUI客户端的介绍
  7. getch, getche, getchar 转
  8. extern 使用方法具体解释
  9. 吴恩达深度学习 —— 2.6 更多导数的例子
  10. Java基础学习——安装JDK
  11. C#+ArcEngine中com对象的释放问题
  12. Android技术专家 高焕堂 推荐这本书
  13. 3D滚动控件实现抽奖效果
  14. CE教程步骤8操作指南
  15. 移动侦测/周界入侵检测视频录像如何通过国标GB28181协议视频平台EasyGBS进行弹出告警
  16. android内存脚本教程,安卓内存
  17. 完美解决Can‘t locate Data/Dumper.pm in @INC
  18. 【Word】Word更改默认模板样式——使用自定义模板【以Windows10+Word2019为例】
  19. Html+CSS+JS轮播图:手动轮播,自动轮播
  20. 火车头采集翻页内容_火车头采集:内容替换支持[参数],标签

热门文章

  1. jaxb 命名空间_在JAXB解组期间应用名称空间
  2. 应用JDK 9 @不推荐使用的增强功能
  3. flink 复杂事件_复杂的(事件)世界
  4. 意外分配– JIT编译抖动
  5. 在Spring Boot中使用@ConfigurationProperties
  6. 使用Java 8 Streams进行编程对算法性能的影响
  7. Spring XD 1.0.0.M5在这里!
  8. ThreadLocal如何实现?
  9. Hamcrest Matchers,Guava谓词和Builder设计模式
  10. Camel 2.11 –没有Spring的Camel Web应用程序