Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTML5离线应用程序中是否需要swapCache()?_Html_Offline_Application Cache - Fatal编程技术网

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”:没有新的应用程序缓存可交换。
    这很酷。如果你不调用它,浏览器会不会在下一个页面加载时被卡住很长时间?还有,调用它之后会发生什么,如果包含一些新文件。。。会不会有一半的文件(已经加载的)来自旧版本,另一半来自新版本