11

如果我不实现任何updateready事件处理程序并且不调用swapCache(),这是否意味着浏览器将始终使用应用程序的第一个(最旧)下载版本?

如果不是,那么为什么swapCache()需要该方法?

4

6 回答 6

12

Swapcache 确保从新缓存中获取对缓存资源的“后续”调用。swapcache 之后的后续含义。要查看实际情况,请尝试在 updateready 事件中的 swapcache 调用之后动态设置 img 的 src 属性(以便浏览器在特定时间加载它)。确保此图像尚未加载到页面的其他位置,因为这会扭曲此测试。现在更改图像并更改清单文件(以强制重新加载缓存文件)。在浏览器中重新加载页面。您现在应该在渲染页面中看到新版本的图像。现在注释掉对 swapcache 的调用。更改清单文件并重新加载页面和所有资源。再次刷新页面(以确保您有来自新缓存的版本)。现在再次更改图像并更改清单。再次重新加载页面:现在您可以看到旧版本的图像。在最后一种情况下,浏览器在缓存中完成了新版本的加载,但是由于没有调用 swapcache,图像仍然是从旧缓存中获取的。

如果您不对页面中的资源进行任何动态加载,则交换缓存无效。

特别是,如果您在 updateready 事件处理程序中重新加载页面,首先调用 swapcache 没有任何效果,因为重新加载页面无论如何都会从新缓存中获取它。

于 2011-09-12T13:30:47.540 回答
7

我有一个缓存非常大(> 100mb)的应用程序。这需要特别长的时间来交换缓存(并且在发生这种情况时几乎会锁定浏览器)。因此,我显示一条消息,指示应用程序正在更新(请稍候...),然后调用swapCache(),然后在完成后显示一条新消息,指示完成。

不确定这是否回答了您的问题(至于为什么需要它),但我认为它swapCache()至少提供了一个有效的用例。

于 2010-09-16T20:11:05.933 回答
4

让我们想象2个不同的场景。

  1. location.reload()当新内容可用时,您调用。该页面将使用其全新内容重新加载。applicationCache.swapCache()在这种情况下不需要。

  2. 您的用户继续与您的页面交互,无需重新加载。这种交互会导致资产动态加载。为了便于论证,我们假设它是一个翻转图像,并且假设您刚刚更新了这个翻转图像。如果没有applicationCache.swapCache(),您的用户将继续看到旧的翻转图像。之后applicationCache.swapCache(),她/他将看到新的翻转图像。

因此applicationCache.swapCache() ,无需重新加载就说:“保持页面在加载时的样子,但现在使用任何新资产,只要页面要求它们”。

于 2013-12-20T18:34:28.617 回答
3

The SwapCache method provides a mechanism for the application to be in control of how an when updates are applied. In regular HTML apps, it can be difficult to determine if the correct JS is present on the clients browser. Also browser implementations vary on when a cache would be updated, I found the iPhone particularly stubborn. swapCache put me back in control of how my app is updated i.e. I could choose to automatically apply the patch or let the user choose when to apply etc.

于 2010-01-15T20:33:09.433 回答
2

我想知道同样的事情。我似乎可以通过调用“window.applicationCache.update()”来触发成功的更新。如果清单文件已被修改,则触发“下载”事件,然后最终“更新就绪”。

当我重新加载它时,它似乎已被应用。我似乎不需要调用 swapCache()。我已经准备好从应用程序调用它,但到目前为止还没有注意到对更新过程有任何影响。

调用 update() 基本上消除了一次重新加载,AFAICS。

于 2010-07-04T09:17:40.420 回答
0

swapCache将从缓存清单中列出的上一组资源(加载运行的 web 应用程序时)切换到新的一组。毕竟,您这样做是为了响应updateready一个新的清单已加载的信号。

不要将这与加载单个资源混淆,通常的浏览器缓存策略仍然适用。换句话说,您将交换一组资源,但各个资源需要自己的缓存管理,以确保在您需要时重新加载它们。

我还没有尝试过,但它似乎建议将代码构建为处理更新过程的“更新控制器”javascript 文件,以及具有已知入口点的版本化文件名(或 URL)的 javascript 源。

于 2011-08-23T16:08:44.577 回答