首页 > 其他分享 >应用缓存初级使用指南

应用缓存初级使用指南

时间:2023-05-16 10:03:36浏览次数:50  
标签:文件 缓存 appCache manifest 初级 html 清单 使用指南


离线访问对基于网络的应用而言越来越重要。虽然所有浏览器都有缓存机制,但它们并不可靠,也不一定总能起到预期的作用。HTML5 使用 ApplicationCache 接口解决了由离线带来的部分难题。

使用缓存接口可为您的应用带来以下三个优势:

  1. 离线浏览 - 用户可在离线时浏览您的完整网站
  2. 速度 - 缓存资源为本地资源,因此加载速度较快。
  3. 服务器负载更少 - 浏览器只会从发生了更改的服务器下载资源。

应用缓存(又称 AppCache)可让开发人员指定浏览器应缓存哪些文件以供离线用户访问。即使用户在离线状态下按了刷新按钮,您的应用也会正常加载和运行。

缓存清单文件

缓存清单文件是个简单的文本文件,其中列出了浏览器应缓存以供离线访问的资源。

引用清单文件

要启用某个应用的应用缓存,请在文档的 html

<htmlmanifest="example.appcache">
  ...
</html>

您应在要缓存的网络应用的每个页面上都添加 manifest 属性。如果网页不包含manifest 属性,浏览器就不会缓存该网页(除非清单文件中明确列出了该属性)。这就意味着用户浏览的每个包含 manifestmanifest

<htmlmanifest="http://www.example.com/example.mf">
  ...
</html>

清单文件必须以 text/cache-manifest MIME 类型提供。您可能需要向网络服务器或 .htaccess

例如,要在 Apache 中提供此 MIME 类型,请在您的配置文件中添加下面一行内容:

AddType text/cache-manifest .appcache

要在 Google App Engine 的 app.yaml 文件中提供此 MIME 类型,则添加以下内容:

- url:/mystaticdir/(.*\.appcache)
  static_files: mystaticdir/\1
  mime_type: text/cache-manifest
  upload: mystaticdir/(.*\.appcache)

清单文件结构

简单的清单格式如下:

CACHE MANIFEST
index.html
stylesheet.css
images/logo.png
scripts/main.js

该示例将在指定此清单文件的网页上缓存四个文件。

您需要注意以下几点:

CACHE MANIFEST

  • 网站的缓存数据量不得超过 5 MB。不过,如果您要编写的是针对 Chrome 网上应用店的应用,可使用 

unlimitedStorage

  • 如果清单文件或其中指定的资源无法下载,就无法进行整个缓存更新进程。在这种情况下,浏览器将继续使用原应用缓存。

我们再来看看更复杂的示例:

CACHE MANIFEST
# 2010-06-18:v2# Explicitly cached 'master entries'.
CACHE:/favicon.ico
index.html
stylesheet.css
images/logo.png
scripts/main.js

# Resources that require the user to be online.
NETWORK:
login.php
/myapi
http://api.twitter.com# static.html will be served if main.py is inaccessible# offline.jpg will be served in place of all images in images/large/# offline.html will be served in place of all other .html files
FALLBACK:/main.py /static.html
images/large/ images/offline.jpg
*.html /offline.html

以“#”开头的行是注释行,但也可用于其他用途。应用缓存只在其清单文件发生更改时才会更新。例如,如果您修改了图片资源或更改了 JavaScript 函数,这些更改不会重新缓存。您必须修改清单文件本身才能让浏览器刷新缓存文件。使用生成的版本号、文件哈希值或时间戳创建注释行,可确保用户获得您的软件的最新版。您还可以在出现新版本后,以编程方式更新缓存,如更新缓存部分中所述。

清单可包括以下三个不同部分:CACHENETWORK 和 FALLBACK

CACHE

CACHE MANIFEST

NETWORK

此部分下列出的文件是需要连接到服务器的白名单资源。无论用户是否处于离线状态,对这些资源的所有请求都会绕过缓存。可使用通配符。 FALLBACK

此部分是可选的,用于指定无法访问资源时的后备网页。其中第一个 URI 代表资源,第二个代表后备网页。两个 URI 必须相关,并且必须与清单文件同源。可使用通配符。

请注意:这些部分可按任意顺序排列,且每个部分均可在同一清单中重复出现。

以下清单定义了用户尝试离线访问网站的根时显示的“综合性”网页 (offline.html),也表明了其他所有资源(例如远程网站上的资源)均需要互联网连接。

CACHE MANIFEST
# 2010-06-18:v3# Explicitly cached entries
index.html
css/style.css

# offline.html will be displayed if the user is offline
FALLBACK:/ /offline.html

# All other resources (e.g. sites) require the user to be online. 
NETWORK:*# Additional resources to cache
CACHE:
images/logo1.png
images/logo2.png
images/logo3.png

请注意:系统会自动缓存引用清单文件的 HTML 文件。因此您无需将其添加到清单中,但我们建议您这样做。

请注意:HTTP 缓存标头以及对通过 SSL 提供的网页设置的缓存限制将被替换为缓存清单。因此,通过 https 提供的网页可实现离线运行。

更新缓存

应用在离线后将保持缓存状态,除非发生以下某种情况:

  1. 用户清除了浏览器对您网站的数据存储。
  2. 清单文件经过修改。请注意:更新清单中列出的某个文件并不意味着浏览器会重新缓存该资源。清单文件本身必须进行更改。
  3. 应用缓存通过编程方式进行更新。

缓存状态

window.applicationCache 对象是对浏览器的应用缓存的编程访问方式。其status

var appCache = window.applicationCache;switch(appCache.status){case appCache.UNCACHED:// UNCACHED == 0return'UNCACHED';break;case appCache.IDLE:// IDLE == 1return'IDLE';break;case appCache.CHECKING:// CHECKING == 2return'CHECKING';break;case appCache.DOWNLOADING:// DOWNLOADING == 3return'DOWNLOADING';break;case appCache.UPDATEREADY:// UPDATEREADY == 4return'UPDATEREADY';break;case appCache.OBSOLETE:// OBSOLETE == 5return'OBSOLETE';break;default:return'UKNOWN CACHE STATUS';break;};

要以编程方式更新缓存,请先调用 applicationCache.update()。此操作将尝试更新用户的缓存(前提是已更改清单文件)。最后,当applicationCache.status 处于 UPDATEREADY 状态时,调用applicationCache.swapCache()

var appCache = window.applicationCache;

appCache.update();// Attempt to update the user's cache....if(appCache.status == window.applicationCache.UPDATEREADY){
  appCache.swapCache();// The fetch was successful, swap in the new cache.}

请注意:以这种方式使用 update() 和 swapCache()好消息是,您可以避免重新加载两次的麻烦。要使用户更新到最新版网站,可设置监听器,以监听网页加载时的 updateready

// Check if a new cache is available on page load.
window.addEventListener('load',function(e){

  window.applicationCache.addEventListener('updateready',function(e){if(window.applicationCache.status == window.applicationCache.UPDATEREADY){// Browser downloaded a new app cache.// Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();if(confirm('A new version of this site is available. Load it?')){
        window.location.reload();}}else{// Manifest didn't changed. Nothing new to server.}},false);},false);

AppCache 事件

正如您所预期的那样,附加事件会用于监听缓存的状态。浏览器会对下载进度、应用缓存更新和错误状态等情况触发相应事件。以下代码段为每种缓存事件类型设置了事件监听器:

function handleCacheEvent(e){//...}function handleCacheError(e){
  alert('Error: Cache failed to update!');};// Fired after the first cache of the manifest.
appCache.addEventListener('cached', handleCacheEvent,false);// Checking for an update. Always the first event fired in the sequence.
appCache.addEventListener('checking', handleCacheEvent,false);// An update was found. The browser is fetching resources.
appCache.addEventListener('downloading', handleCacheEvent,false);// The manifest returns 404 or 410, the download failed,// or the manifest changed while the download was in progress.
appCache.addEventListener('error', handleCacheError,false);// Fired after the first download of the manifest.
appCache.addEventListener('noupdate', handleCacheEvent,false);// Fired if the manifest file returns a 404 or 410.// This results in the application cache being deleted.
appCache.addEventListener('obsolete', handleCacheEvent,false);// Fired for each resource listed in the manifest as it is being fetched.
appCache.addEventListener('progress', handleCacheEvent,false);// Fired when the manifest resources have been newly redownloaded.
appCache.addEventListener('updateready', handleCacheEvent,false);

如果清单文件或其中指定的资源无法下载,整个更新都将失败。在这种情况下,浏览器将继续使用原应用缓存。

 

标签:文件,缓存,appCache,manifest,初级,html,清单,使用指南
From: https://blog.51cto.com/u_16112859/6282442

相关文章

  • 【Azure Redis 缓存】使用开源工具redis-copy时遇见6379端口无法连接到Redis服务器的
    问题描述当使用AzureRedis服务时,需要把一个Redis服务的数据导入到另一个Redis上,因为Redis服务没有使用高级版,所以不支持直接导入/导出RDB文件。以编程方式来读取数据并写入到新的Redis服务端,使用开源工具Redis-Copy却遇见了6379端口无法连接的问题。而用redis-cli.exe却......
  • 如何设计分布式缓存-浅谈
    最近在看极客兔兔大佬的七天用Go从零实现系列,其中有个分布式缓存geeCache,从设计的角度整理下自己的想法和思路。如何设计分布式缓存?设计一个分布式缓存系统,需要考虑资源控制、淘汰策略、并发、分布式节点通信等各个方面的问题。从上述方面考虑,我们需要实现的功能如下1、缓存功......
  • 微信小程序头像昵称填写能力-数据存储至缓存
    又到了一年一度的授权接口修改时间---ps.去年10月,希望今年能消停点。话不多说上代码。setName文件:<buttonclass="avatar-wrapper"open-type="chooseAvatar"bind:chooseavatar="onChooseAvatar"><imageclass="avatar"src="{{avatarUrl}}"&g......
  • 小程序优化之旅(三) -- 请求缓存与预请求优化
    一、预请求概念首先在一开始还是先明确下这里所提及到的“预请求”的概念和常规的http的options请求有所区别,这篇文章所涉及到的预请求的概念都是在页面切换时候的页面请求的提请发送,跳转进入新页面后能够快速的获取到服务端的数据。1.1预请求的业务含义为啥需要要做这个......
  • 缓存一致性
    通信模式共享存储统一的地址空间,每一个处理器都可以访问。但是需要注意并发控制。使用线程。消息传递使用单独的地址 共享存储系统因为性能原因,使用多个私有缓存当一个chip读取一个值时,必须读取到最近写入的值。缓存一致性(CacheCoherence):执行一个读操作,应该返回哪一个......
  • 前端项目更新的缓存问题
    问题描述:微信公众号前端项目更新总会遇到不会加载最新代码问题,需要进行多次刷新或手动清空微信缓存。问题分析:1、前端项目本身是否存在缓存配置;2、nginx是否存在缓存配置。解决方案:在前端项目配置做过动态hash处理的前提下,更新后构建输出的cssjs图片等文件会被重新请......
  • 使用 jQuery Mobile 与 HTML5 开发 Web App (十七) —— HTML5 离线缓存
    本文要介绍的,是HTML5离线网络应用程序的特性,离线网络应用程序在W3C中的实际名称是"OfflineWebapplications",也称离线缓存。当用户打开浏览器时,浏览器会将一个列表中指定的资源都下载并储存在本地。下次当用户再访问这个网络程序时,浏览器会自动引用本地缓存中相应的文件,而......
  • 详解缓存更新策略及如何选择
    概述缓存更新是指在数据发生变化时,保持缓存和数据库的数据一致性的问题。如果缓存和数据库的数据不一致,会导致用户看到过期或者错误的数据,影响业务逻辑和用户体验。为了实现缓存更新,我们可以采用以下四种方式其中的一种:CacheAside策略:应用程序直接与数据库和缓存交互,并负责......
  • 泛微代码刷新缓存
    工具类:weaver.monitor.cache.CacheFactory;相关方法:ResultMapgetRecordCache(Stringvar1,Object...var2)refreshCache(Stringvar1,Objectvar2,ResultMapvar3)removeCacheForSql(Stringsql,Object...var2) ......
  • 更新缓存操作
    需求分析:问题描述:并发操作redis,发现redis连接数增长异常(呈直线上升)原因分析:发现redis更新时,没有处理好之前的连接缓存,而是直接替换,导致旧的缓存没有及时删除。修改方案:1.更新时,先关闭之前的连接,再替换2.只更新redis配置修改的连接update:之前的连接:比较(ip,pass......