如何让网站用上HTML5 Manifest

简介:

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

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

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

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

1. 使用Manifest

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

 
  1. <html manifest="/static/manifest/home.appcache"

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

 
  1. CACHE MANIFEST 
  2. #9/27/2017, 3:04:25 PM 
  3. #html 
  4. https://github.com/ 
  5. #img 
  6. https://assets-cdn.github.com/images/modules/site/universe-octoshop.png 
  7. https://assets-cdn.github.com/images/modules/site/universe-wordmark.png 
  8. #css 
  9. https://assets-cdn.github.com/assets/frameworks-bedfc518345231565091.css 
  10. #js 
  11. https://assets-cdn.github.com/assets/compat-94eba6e3cd1fa18902d9.js 
  12. NETWORK: 
  13.   
  14. FALLBACK 
  15. 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的网站,例如https://fed.renren.com,可以观察到Chrome控制台cache的过程:

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

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

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

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

 
  1. #9/29/2017, 9:08:49 AM 

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

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

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

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

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

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

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

 
  1. npm install -g generate-manifest 
  2. generate-manifest --url=https://github.com 

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

 
  1. CACHE MANIFEST 
  2. #9/27/2017, 3:04:25 PM 
  3. #html 
  4. https://github.com/ 
  5. #img 
  6. https://assets-cdn.github.com/images/modules/site/universe-octoshop.png 
  7. https://assets-cdn.github.com/images/modules/site/universe-wordmark.png 
  8. #css 
  9. https://assets-cdn.github.com/assets/frameworks-bedfc518345498ab3204d330c1727cde7e733526a09cd7df6867f6a231565091.css 
  10. #js 
  11. https://assets-cdn.github.com/assets/compat-91f98c37fc84eac24836eec2567e9912742094369a04c4eba6e3cd1fa18902d9.js 
  12. NETWORK: 
  13.   
  14. FALLBACK 
  15. https://github.com/ /html/manifest/html/home.html 

还可以支持其它参数定制,详见:generate-manifest

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

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

https://fed.renren.com/refresh-manifest.php?

link=https://fed.renren.com/2017/09/26/manifest/

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

 
  1. <?php 
  2.     $uri = "$_SERVER[REQUEST_URI]"
  3.     $uriArray = explode("/", $uri); 
  4.     $uriName = count($uriArray) > 2 ? $uriArray[count($uriArray) - 2] : "home"
  5. ?> 
  6. <!DOCTYPE html> 
  7. <html <?php language_attributes(); ?> manifest=<?php echo "/html/manifest/appcache/$uriName.appcache"?>> 

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

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

第三个问题:阅读量数据变化的——写一个Linux定时任务,使用crontab添加一个定时任务,执行crontab -e添加:    

 
  1. 0 3 * * * /home/fed/manifest/update-all.sh 

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

 
  1. generate-manifest --url=https://fed.renren.com 
  2. generate-manifest --url=https://fed.renren.com/page/2/ 
  3. generate-manifest --url=https://fed.renren.com/page/3/ 
  4. #..其它... 

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

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

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

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

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

 
  1. function onUpdateReady() { 
  2.     window.location.reload(true); 
  3. window.applicationCache.addEventListener('updateready', onUpdateReady); 
  4. if(window.applicationCache.status === window.applicationCache.UPDATEREADY) { 
  5.     onUpdateReady(); 

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

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


本文作者:人人网FED

来源:51CTO

相关文章
|
1月前
|
移动开发 搜索推荐 HTML5
如何使用HTML5的语义化标签来提高网站的可访问性?
【4月更文挑战第1天】如何使用HTML5的语义化标签来提高网站的可访问性?
33 1
静态网页html+css的真ikun网站
静态网页html+css的真ikun网站
|
7月前
|
前端开发
【HTML实战】把爱心代码放在自己的网站上是一种什么体验?
【HTML实战】把爱心代码放在自己的网站上是一种什么体验?
|
1天前
好看的html网站维护源码
好看的html网站维护源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,
16 3
好看的html网站维护源码
|
12天前
|
编解码 前端开发 JavaScript
【专栏:HTML与CSS实战项目篇】打造一个动态新闻网站
【4月更文挑战第30天】构建动态新闻网站,运用HTML和CSS提升编程技能和网页设计理解。项目包括首页、新闻列表页和详情页,设计简洁易用,包含顶部导航、轮播图和新闻列表。页面布局注重吸引力和易用性,色彩搭配选用冷色调为主,辅以亮色点缀。字体选择清晰易读,布局保持整洁。交互效果如轮播图、导航栏高亮和响应式设计增强用户体验。本文提供基础新闻网站构建指南,为进一步功能扩展和优化打下基础。
|
12天前
|
前端开发 测试技术 定位技术
【专栏:HTML 与 CSS 实战项目篇】构建一个企业级网站:HTML 与 CSS 实战
【4月更文挑战第30天】本文介绍了使用HTML和CSS构建企业级网站的实战步骤,包括项目概述、页面结构设计、HTML结构搭建、CSS样式设计、具体页面实现、优化与提升。通过合理布局、美观样式和响应式设计,创建现代、简洁的网站,包含主页、关于我们、产品展示、新闻动态和联系我们等页面。优化图片和代码,确保性能,助力企业在数字时代树立良好形象并提升沟通效率。
|
12天前
|
编解码 前端开发 UED
【专栏:HTML与CSS实践篇】HTML与CSS在电商网站中的应用
【4月更文挑战第30天】本文探讨了HTML和CSS在电商网站中的关键作用。HTML作为基础结构,定义网页内容和布局,用于页面布局、内容展示和表单处理;而CSS则负责样式设计和美化,包括响应式设计、交互效果和模块化,两者结合创建出功能齐全、视觉吸引力强的在线购物环境,提升用户体验。
|
12天前
|
编解码 前端开发 UED
【专栏:HTML与CSS实践篇】响应式网站开发实战
【4月更文挑战第30天】本文探讨了响应式网站开发,它能根据用户设备自动调整布局,提供最佳浏览体验。通过HTML和CSS,利用媒体查询、Flexbox和百分比宽度等技术实现响应式设计。媒体查询按屏幕尺寸定义CSS规则,Flexbox处理元素排列。文章通过新闻网站首页设计实例,展示了如何应用这些理论,包括使用Flexbox设计导航栏,使用媒体查询调整轮播图和内容区域,以及创建自适应页脚。遵循移动优先原则,关注性能优化和用户体验,响应式设计是前端开发的关键,为多设备用户提供优质浏览体验。
|
12天前
|
前端开发 搜索推荐 SEO
【专栏:HTML 与 CSS 实践篇】使用 HTML 与 CSS 构建个人博客网站
【4月更文挑战第30天】本文介绍了使用HTML和CSS构建个性化个人博客网站的步骤。首先,规划设计网站主题、风格和结构;接着,利用HTML搭建首页、文章列表页和文章详情页的结构;然后,通过CSS设计整体风格、布局和交互效果;填充内容并进行SEO优化;最后,通过实际案例展示HTML和CSS的应用。构建博客网站不仅是展示自我和分享知识的平台,也是提升技能和创意实践的好机会。
|
16天前
|
移动开发 前端开发 JavaScript
前端vue3——html2canvas给网站截图生成宣传海报
前端vue3——html2canvas给网站截图生成宣传海报
13 0