HTML5怎样设置站点,我是怎样让网站用上HTML5 Manifest

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的就会报加载失败的错误,如下所示:

56fb062f43a88bd1015566b5cad4708d.png

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

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

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

a3acdf8f549411a6a8f4138b0c1a396e.png

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

b52ab8949edc19d0fa83876b4f6d4678.png

并且你把网断了,刷新页面,页面依旧能够正常加载出来。这个在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取代了,但是由于它的简单易用以及兼容性好,我们还是可以用一用。

相关阅读:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wallpaper怎么设置锁屏_Apple ID密码忘了怎么找回?丨如何让面容和指纹解锁立马失效?...

忘记Apple ID这种事肯定不少果粉都经历过&#xff0c;像小编也是如此&#xff0c;因为密码都比较复杂&#xff0c;如果太久没输入过密码&#xff0c;久而久之就忘了。哪一天突然需要用的时候&#xff0c;怎么想也想不起来。想不起来的话我们就别想了&#xff0c;直接重置密码就…

在Java中将时间单位转换为持续时间

java.util.concurrent.TimeUnit以给定的粒度单位表示Java中的持续时间&#xff0c;并提供了跨单位转换的实用方法。 java.util.concurrent.TimeUnit最早是在Java早期&#xff08;1.5&#xff09;引入的&#xff0c;但自那时以来已经被扩展了好几次。 在此博客文章中&#xff0c…

ajax contenttype详解_$.ajax中contentType: “application/json” 的用法详解

具体内容如下所示&#xff1a;$.ajax({type: httpMethod,cache:false,async:false,contentType: "application/json; charsetutf-8",dataType: "json",//返回值类型url: pathurl,data:jsonData,success: function(data){var resultData 返回码data.status…

在text html模版中写js,Rails3使用text/html内容类型而不是text/javascript呈现js.erb模板...

我正在使用3.0.0.beta3构建一个新的应用程序.我只是尝试将js.erb模板呈现给Ajax请求以执行以下操作(在publications_controller.rb中):def get_pubmed_dataentry Bio::PubMed.query(params[:pmid])# searches PubMed and get entrypublication Bio::MEDLINE.new(entry) # cre…

jq监听子元素被点击_vue开发app点击字母展示地区列表(兄弟组件之间联动)

下图这种地区搜索方式在很多app中都很常见&#xff0c;今天就使用vue框架中的 better-scroll 第三方包来实现页面滚动和点击侧边栏字母该字母开头的地区列表置顶功能。1、A子组件通过使用 this.$emit(事件名字&#xff0c;事件携带内容) 向外触发事件首先&#xff0c;在组件每个…

e-mobile帐号状态存在异常_一文掌握异常检测的实用方法 | 技术实践

作者 | Vegard Flovik译者 | Tianyu责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】今天这篇文章会向大家介绍几个有关机器学习和统计分析的技术和应用&#xff0c;并展示如何使用这些方法解决一些具体的异常检测和状态监控实例。相信对一些开发…

用Spring组成自定义注释

Java批注在2004年随Java 5一起引入&#xff0c;是一种将元数据添加到Java源代码中的方法。 如今&#xff0c;许多主要框架&#xff08;如Spring或Hibernate&#xff09;都严重依赖注释。 在本文中&#xff0c;我们将介绍一个非常有用的Spring功能&#xff0c;该功能允许我们基…

单片机sleep函数的头文件_单片机代码模块化设计思想浅谈

前言&#xff1a;前段时间分享的文章【单片机裸机代码框架设计思路】&#xff0c;很多读者给我留言&#xff0c;觉得很不错&#xff0c;对于初学者而言&#xff0c;这是一个进阶的技巧&#xff0c;对于我而言&#xff0c;这是对自己总结和表达能力的一个提升。本文章我们再谈谈…

html中显示数据库中的一条数据,如何使用html表显示数据库中的数据

我正在尝试在HTML表中显示数据库中的数据。主要问题是&#xff1a;该表未出现。IdStringArray// Mostrar dadosecho "{$databaseName visteon;$pdo new Pdo(mysql:host127.0.0.1;dbname . $databaseName, root, );$result $pdo->query(SHOW TABLES FROM . $databas…

jquery 字符串查找_JQuery、Vue等考点

一. 写出下面程序的运行结果for结果&#xff1a;1秒后一下子打印出5个5。当循环完成时才会轮到setTimeout异步执行其回调函数function&#xff0c;此时i已经变成5&#xff0c;故5个console.log(i)里的i全使用的是5。易错点&#xff1a;千万别写成“打印5个4”啊&#xff01;暴风…

html网页效果分析,熟手的html编写风格与原因分析_HTML/Xhtml_网页制作

一、导航&#xff1a;无序列表 对 其它标签元素用最常用的“无序列表“来写导航的理由是显而易见的&#xff0c;它代表一列链接&#xff0c;这本身就有足够的理由应选择列表标签。但需要移除list列表的默认样式&#xff0c;以使其更有意义。另一个好处可能超出你的想象&#xf…

qgis 图片_QGIS入门教程公告!!!

从本周开始&#xff0c;我将每周日更新一期QGIS入门教程视频&#xff0c;带讲解&#xff0c;估计这也是很多朋友所希望的。操作中用到的数据下载链接我会放在每一期的视频下方。以下是入门课程的目录&#xff1a;1.开启你的QGIS之旅——制作你的第一张地图2.属性表基础——字段…

v-if 表单验证_避免许多if块进行验证检查

v-if 表单验证在某些情况下&#xff0c;我们需要先验证输入数据&#xff0c;然后再将其发送到业务逻辑层进行处理&#xff0c;计算等。这种验证在大多数情况下是孤立进行的&#xff0c;或者可能包括与外部数据或其他输入的一些交叉检查。 看下面的示例&#xff0c;该示例验证用…

css less 不要作用到子对象_CSS-预处理语言Sass、Less简述

CSS作为前端开发的三驾马车之一&#xff0c;无时无刻不在影响着前端的发展。为了让 CSS 变得更加的好用&#xff0c;出现了一些预处理语言。 它们让 CSS 彻底变成一门可以使用变量 、循环 、继承 、自定义方法等多种特性的标记语言&#xff0c;逻辑性得以大大增强SassSass是成熟…

html图片平铺div,前端小知识——图片平铺问题

图片平铺有两种方式&#xff0c;直接写img标签或者通过background-image方式1&#xff0c;img标签HTML&#xff1a;CSS:.row{margin:0,auto;width:100%;}img{width:100%;height:100%;margin: 0 auto;display: block;font-size: 0;}这样写的话&#xff0c;三张图片能够垂直平铺&…

JMetro版本11.6.8和8.6.8发布

另一个版本&#xff0c;这次是较短的更新。 撰写文档和博客文章有点不知所措&#xff0c;但是我认为我不得不更新文档&#xff0c;因为它已经被更新了大约一年或更长时间。 因此&#xff0c;对于此发行版&#xff0c;我也专注于此。 这是链接&#xff1a; Javafx主题JMetro页面…

python用pip安装numpy mac_小白入门Python,mac下如何安装pip、ipython

作为一枚小白&#xff0c;最近在学习用Python写科学计算器&#xff0c;因为Mac不自带pip&#xff0c;安装的时候找了好几个帖子&#xff0c;才成功安装。做一下简单分享&#xff0c;希望对大家有帮助&#xff1a; 安装环境&#xff1a; Mac系统版本&#xff1a;OS X 10.11.1 Py…

js 点击侧边栏展示内容_上海SEO优化网站侧边栏一般添加什么内容

相关推荐&#xff1a;https://www.huisheng.com/上海SEO优化网站侧边栏一般添加什么内容&#xff1f;企业做网站每个板块都是非常重要的&#xff0c;之前跟大家解析了关于导航栏的布局&#xff0c;哪些内容该添加&#xff0c;哪些内容不该添加&#xff0c;而今天小编要跟大家解…

html网页设如何置访问密码,利用JS给单页html加上简单访问密码,需要密码才能访问!...

本文最后更新于【 2019-12-21 22:28:00 】&#xff0c;某些文章具有时效性&#xff0c;若有错误或已失效&#xff0c;请在下方 留言 或联系 小P君 。今天在搞一个简单的短域名生成网页的时候&#xff0c;以防被滥用&#xff0c;所以想给html加一个简单的密码&#xff0c;需要…

python装饰器作用噜咕_python 装饰器的实际作用有哪些

终于知道python的装饰器是怎么回事&#xff0c;那在工作中&#xff0c;到底能干吗用呢&#xff1f; 尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜脸。 先说结论&#xff0c;肯定是有用处滴。 一、自动化测试中使用 就拿写的自动化测试来说吧&#xff0c;如果我想…