HTML5离线应用程序中是否需要swapCache()?
如果我没有实现任何HTML5离线应用程序中是否需要swapCache()?,html,offline,application-cache,Html,Offline,Application Cache,如果我没有实现任何updateready事件处理程序,也没有调用swapCache(),这是否意味着浏览器将始终使用应用程序的第一个(最早)下载版本 如果没有,那么为什么需要使用swapCache()方法?swapCache方法提供了一种机制,使应用程序能够控制何时应用更新。在常规HTML应用程序中,很难确定客户端浏览器上是否存在正确的JS。 此外,浏览器的实现因缓存何时更新而有所不同,我发现iPhone特别顽固。swapCache让我重新控制应用程序的更新方式,也就是说,我可以选择自动应用补丁
updateready
事件处理程序,也没有调用swapCache()
,这是否意味着浏览器将始终使用应用程序的第一个(最早)下载版本
如果没有,那么为什么需要使用
swapCache()
方法?swapCache方法提供了一种机制,使应用程序能够控制何时应用更新。在常规HTML应用程序中,很难确定客户端浏览器上是否存在正确的JS。
此外,浏览器的实现因缓存何时更新而有所不同,我发现iPhone特别顽固。swapCache让我重新控制应用程序的更新方式,也就是说,我可以选择自动应用补丁,或者让用户选择何时应用等等。我也在想同样的事情。我似乎能够通过调用“window.applicationCache.update()”触发成功的更新。如果清单文件已被修改,则会触发“下载”事件,然后最终触发“更新就绪” 重新加载时,它似乎已应用。我似乎不需要调用swapCache()。我已经准备好从应用程序中调用它,但到目前为止还没有注意到对更新过程有任何影响
调用update()基本上消除了一次重新加载,即AFAICS。我有一个应用程序具有相当大的缓存(>100mb)。这需要特别长的时间来交换缓存(并且在交换过程中会锁定浏览器)。因此,我显示一条消息,指示应用程序正在更新(请稍候…),然后调用
swapCache()
,然后在完成后显示一条新消息,指示完成
不确定这是否回答了您的问题(关于为什么需要它),但我认为它至少为
swapCache()
提供了一个有效的用例。swapCache
将从缓存清单中列出的前一组资源(加载运行的webapp时)切换到新的资源集。您这样做是为了响应updateready
,毕竟,它表示已加载新清单
这不能与加载单个资源相混淆,通常的浏览器缓存策略仍然适用于这些资源。换句话说,您将交换一组资源,但单个资源需要自己的缓存管理,以确保在需要时重新加载它们
我还没有尝试过这一点,但它似乎建议将代码构造为处理更新过程的“更新控制器”javascript文件,以及具有版本化文件名(或URL)和已知入口点的javascript源。Swapcache确保对缓存资源的“后续”调用从新缓存中获取。
swapcache之后的后续含义。
要查看此操作,请尝试在
updateready事件中的swapcache调用(以便浏览器在该特定位置加载它)
时间)。确保此图像尚未加载到页面中的其他位置,因为这样会
歪曲这个测试。
现在更改图像并更改清单文件(强制重新加载缓存文件)。
在浏览器中重新加载页面。
现在,您应该可以在渲染页面中看到图像的新版本。
现在注释掉对swapcache的调用。
对清单文件进行更改并重新加载页面和所有资源。
再次刷新页面(以确保您拥有新缓存中的版本)。
现在再次更改图像并更改清单。
再次重新加载页面:现在可以看到图像的旧版本。
在最后一种情况下,浏览器在缓存中加载完新版本,但自
未调用swapcache,图像仍从旧缓存中获取
如果您不在页面中动态加载资源,则swapcache没有任何效果
特别是,如果在调用swapcache的updateready事件处理程序中重新加载页面
第一个没有效果,因为重新加载页面将从新缓存中获取它。让我们想象两种不同的场景
location.reload()
。页面将使用其全新内容重新加载<代码>应用程序缓存。在这种情况下不需要swapCache()applicationCache.swapCache()
,用户将继续看到旧的滚动图像。在applicationCache.swapCache()
之后,他/她将看到新的滚动图像因此,
applicationCache.swapCache()
在不重新加载的情况下会说:“保持页面加载时的外观,但在页面要求时立即使用任何新资产”。在updateready
上,我显示了一个“更新可用,单击立即重新启动”通知并执行location.reload()代码>点击。如果他们不点击,应用程序将在下次加载时自动更新。我不明白如何使用swapCache()
在不重新加载的情况下更新应用程序。通过重新加载,我无论如何都不需要swapCache()
。我仍然不明白什么时候需要它。比这更奇怪:在Chrome中,我得到updateready
事件,当我调用swapCache()
内部处理程序时,Chrome抱怨未捕获InvalidStateError:未能在“ApplicationCache”上执行“swapCache”:没有新的应用程序缓存可交换。
这很酷。如果你不调用它,浏览器会不会在下一个页面加载时被卡住很长时间?还有,调用它之后会发生什么,如果包含一些新文件。。。会不会有一半的文件(已经加载的)来自旧版本,另一半来自新版本