html5应用缓存与Web Workers

简介:

HTML5当中引入了应用程序缓存,这意味着web应用可以进行缓存,并且可以在没有网络连接的时候进行访问。

应用缓存的优势

  • 离线浏览,用户可以在离线的时候浏览已经加载并且缓存好的数据

  • 加快加载速度。

  • 减少服务器负载。

实现用缓存

如果启用应用程序缓存,需要在<html>标签当中包含manifest属性,manifest文件的建议扩展名是:”.appcache”

manifest文件

manifest文件为我们提供了三种缓存的方式: 
version n.n :version表示当前manifest的版本,当version发生变化的时候,此时当用户再次加载的时候,会将CACHE标签下列出的所有文件重新下载一次。 
- CACHE MANIFEST:在此标题下列出的文件,将在首次下载后进行缓存。 
- NETWORK: 在此标题下列出的文件需要与服务器的链接,且不会被缓存。 
- FALLBACK: 在此标题下列出的文件,规定访问缓存失败后,备用访问的资源,第一个是访问源,第二个是替换文件*.html /offline.html,例如404页面。

缓存的应用

这里我创建一个web工程,并且新建一个html文件: 
index.html

<!DOCTYPE html><html manifest="index.appcache">   <head>     <title>index.html</title>     <link rel="stylesheet" type="text/css" href="./css/style.css">   </head>    <body>     <h1>This is my HTML page</h1>   </body></html>1234567891012345678910

style.css

@CHARSET "UTF-8";h1 {    color: aqua;}12341234

可以看到这里,我的页面很简单,并且引用了一个style.css样式文件。并且在<html>标签当中,指定了缓存文件index.appcache. 
index.appcache 内容如下:

CACHE MANIFEST#version 1.0CACHE:index.htmlcss/style.css1234512345

可以看到,这里我们使用CACHE类型的缓存,表示需要缓存index.html和css/style.css这两个文件。此时打开服务器,浏览该网页,在关闭服务器,会发现该网页同样可以访问,此时按下F12,打开开发者选项,会发现有如下缓存: 
这里写图片描述

同时也可以使用NETWORK类型的缓存,来表示那些文件是需要联网下载的,这里我将css/style.css文件写入到NETWORK类型的缓存当中。

CACHE MANIFEST#version 1.0CACHE:index.htmlNETWORK:css/style.css1234567812345678

首先需要手动清除一下之前缓存的记录。然后打开服务器,浏览http://localhost:8080/html5cache/index.html,此时显示效果如下: 
这里写图片描述 
可以看到此时只是缓存了html页面,并没有缓存css/style.css文件,此时关闭服务器,再次刷新该页面,效果如下: 
这里写图片描述 
可以看到此时,就只是加载了html页面,并么有加载css文件,所以h1标签的字体是默认的。

更新缓存

如果需要更新缓存,比如这里我更改了html中的文字,此时再次访问http://localhost:8080/html5cache/index.html 的时候,是不会加载最新的页面文字的,这是因为浏览器默认会到缓存中查找,如果缓存中有,则直接从缓存中取出,因此我们需要更新缓存文件”index.appcache”中的version即可,如下:

CACHE MANIFEST#version 1.1CACHE:css/style.cssindex.htmlNETWORK:FALLBACK:1234567891012345678910

这里,我将version更改了1.1,此时再次访问该页面的时候, 是会到服务其下载最新的页面,说到这里,缓存的缺点就出来了,就是哪怕我一个页面中只更新一行文字,但是当我更改了”index.appcache”文件中的version值之后,就会重新将CACHE中定义的所有内容,重新下载一次。

使用js自动更新缓存

另外,我们还可以使用applicationcache对象来自动更新缓存。如下:

<script type="text/javascript">          //添加页面加载函数         window.addEventListener('load', function(e) {           //为applicationCache对象添加updateready事件            window.applicationCache.addEventListener('updateready', function(e) {             //表示manifest中列举的文件已经重新下载并更新成功             if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {              //使用swapCache()方法更新到应用程序中               window.applicationCache.swapCache();              if (confirm('A new version of this site is available. Load it?')) {                //重新加载当前页面                 window.location.reload();               }             } else {                //manifest文件没有变化                 console.log("manifest 没有改变");             }           }, false);         }, false);    </script>12345678910111213141516171819202122232425261234567891011121314151617181920212223242526

applicationcache是window对象的直接子对象,该对象的事件列表如下: 
这里写图片描述 
status 返回缓存的状态

可选值 匹配常量 描述
0 appCache.UNCACHED 未缓存
1 appCache.IDLE 闲置
2 appCache.CHECKING 检查中
3 appCache.DOWNLOADING 下载中
4 appCache.UPDATEREADY 已更新
5 appCache.OBSOLETE 失效

方法

方法名 匹配常量
update() 发起应用程序缓存下载进程
abort() 取消正在进行的缓存下载
swapcache() 切换成本地最新的缓存环境

web workers

web workers是运行在后台的脚本,独立于其他的脚本,不会影响页面的性能。类似于Android开发中的handler。将繁重耗时的计算放到web worker中来实现,然后将处理的结果返回给主UI线程来显示。

web workers方法

  • postMessage() :用于向html页面回传一段消息。

  • terminate() :终止web workers,并且释放计算机资源。

web workers简单实现

下面使用web workers简单实现一数字更新的demo: 
新建一个web工程,创建index.html

<!DOCTYPE html><html><head lang="en">     <meta charset="UTF-8">     <title></title>     <script src="index.js"></script></head><body>     <div id="numDiv">0</div></body></html>12345678910111234567891011

这里在index.html文件当中引入了index.js文件。 
index.js

var numDiv; window.onload = function(){     numDiv = document.getElementById("numDiv");    var work = new Worker("count.js");     work.onmessage = function(e) {         //alert(e.data);         numDiv.innerHTML = e.data;     }; };123456789123456789

可以看到,这里讲更新数据的具体操作,使用Worker来更新,在worker当中加载了count.js文件来做一些耗时,复杂的计算。然后使用worker的onmessage回调方法,将count.js返回的结果重新显示给numDiv。 
count.js

var countNum = 0;function count(){     postMessage(countNum);//通过postMessage方法将计算结果回传给调用者     countNum++;     setTimeout(count,1000); } count();12345671234567

count.js文件比较简单,每隔一秒更新countNum的值,然后回传给调用者,也就是这里的index.js

此时运行效果如下: 
这里写图片描述

下面添加一个开始停止的控制按钮:

 <button id="start">start</button>  <button id="stop">stop</button>1212

index.js

var numDiv;var work; window.onload = function(){     numDiv = document.getElementById("numDiv");    var start = document.getElementById("start");    var stop = document.getElementById("stop");     start.onclick = startWorker;     stop.onclick = stopWorker; };function startWorker() {     if (work) { //如果work存在,则直接返回         return;     } else {         work = new Worker("count.js");         work.onmessage = function(e) {             numDiv.innerHTML = e.data;         };     } }function stopWorker() {     if (work) {//如果worker存在,则终止并且为其重新赋值         work.terminate();         work = null;     } }1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728

此时运行效果如下: 
这里写图片描述

另外我们还可以通过navaigator对象的onLine属性来判断当前浏览器是否在线,该属性属于只读属性,会返回boolean类型的值。

if(window.navigator.onLine) {    //在线} else {    //离线}1234512345

转载至:http://blog.csdn.net/mockingbirds/article/details/48412967

相关文章
|
存储 移动开发 大数据
HTML5 Web IndexedDB 数据库详解
IndexedDB 是一种高效的浏览器存储方案,允许在本地存储大量结构化数据,支持索引和事务,适用于需要离线和大数据处理的应用。它由数据库、对象仓库等组成,通过键值对存储数据,确保数据一致性和完整性。本介绍展示了如何创建、读取、更新和删除数据,以及事务和错误处理的最佳实践。
1358 10
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
377 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
368 6
|
前端开发 JavaScript UED
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势,包括样式表优化、DOM操作减少、图像优化等技术,并分析了电商网站的具体案例,强调了技术演进对Web性能的深远影响。
224 5
|
机器学习/深度学习 移动开发 自然语言处理
HTML5与神经网络技术的结合有哪些其他应用
HTML5与神经网络技术的结合有哪些其他应用
205 3
|
JavaScript 前端开发 UED
HTML 超链接的多种类型及应用
【10月更文挑战第17天】HTML 超链接类型丰富多样,它们共同构成了网页中不可或缺的导航和交互元素。通过合理地选择和运用这些超链接类型,我们可以为用户创造更加流畅和便捷的浏览体验,提升网站的可用性和吸引力。
822 1
|
存储 移动开发 数据库
HTML5 Web IndexedDB 数据库常用数据存储类型
IndexedDB 支持多种数据存储类型,满足复杂数据结构的存储需求。它包括基本数据类型(如 Number、String、Boolean、Date)、对象(简单和嵌套对象)、数组、Blob(用于二进制数据如图像和视频)、ArrayBuffer 和 Typed Arrays(处理二进制数据)、结构化克隆(支持 Map 和 Set 等复杂对象),以及 JSON 数据。尽管不直接支持非序列化数据(如函数和 DOM 节点),但可以通过转换实现存储。开发者应根据具体需求选择合适的数据类型,以优化性能和使用体验。
1034 10
|
缓存 移动开发 前端开发
HTML5 应用程序缓存详解
HTML5 应用程序缓存(Application Cache)通过缓存 HTML、JavaScript、CSS 和图像等资源,使 Web 应用能在离线状态下运行。它利用 Manifest 文件(`.appcache`)定义缓存资源列表,浏览器会在加载页面时下载并缓存这些资源。此外,应用程序缓存还提供了事件处理机制,允许开发者监控缓存状态并进行手动管理。尽管这一技术已被视为过时,建议使用 Service Workers 和 Cache API 等现代替代方案来实现更强大的离线功能和缓存控制。
|
SQL 存储 移动开发
HTML5 Web SQL 数据库详解
Web SQL 数据库是 HTML5 中的一种本地存储技术,允许在浏览器中使用 SQL 语言操作本地数据,支持离线访问和事务处理,适用于缓存数据和小型应用。然而,其存储容量有限且仅部分现代浏览器支持,标准已不再积极维护,未来可能被 IndexedDB 和 localStorage 等技术取代。使用时需谨慎考虑兼容性和发展前景。
|
移动开发 JavaScript 前端开发
HTML5 Web Workers详解
HTML5 Web Workers 允许在后台线程中运行 JavaScript,实现复杂计算而不影响用户界面,提升应用性能。其主要特性包括并行处理、异步通信、独立作用域及多数据类型支持。通过创建和使用 Worker 文件,如 `worker.js`,可执行后台任务,并与主线程通过消息传递机制通信。适用于数据处理、图像处理、复杂计算及网络请求并行等场景。需要注意的是,Web Workers 在浏览器兼容性、安全性限制、调试及资源消耗方面需特别关注。合理利用 Web Workers 可显著增强 Web 应用的流畅度和响应速度。