2009-12-12 56 views

回答

3

SwapCache方法为应用程序提供了一种控制应用更新时机的机制。在普通的HTML应用程序中,可能很难确定客户端浏览器中是否存在正确的JS。 另外浏览器的实现方式也不尽相同,当缓存更新时,我发现iPhone特别固执。 swapCache让我重新控制如何更新我的应用程序,即我可以选择自动应用修补程序或让用户选择何时应用等。

+9

在'updateready'上,我显示“Update available,点击立即重新启动”通知,并执行'location.reload();'点击。如果他们没有点击,则下次加载时应用程序会自行更新。 我不明白我怎么可以更新应用程序而无需重新加载,'swapCache()'。 *用*重载,反正我不需要'swapCache()'。 我还是不明白什么时候需要它。 – 2010-01-16 11:09:26

+1

得到的甚至比这更奇怪:在Chrome Im获取'updateready'事件并且当我在内部处理程序中调用'swapCache()'时,Chrome会抱怨'Uncaught InvalidStateError:无法执行'ApplicationCache'上的'swapCache':没有新的应用程序缓存交换。“ – Mati 2014-11-20 11:39:46

2

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

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

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

7

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

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

+0

这很酷。如果你没有调用它,会发生什么情况,浏览器是否会在下一页加载时被卡住很长时间?而且,如果包含一些新文件,在调用它之后会发生什么情况......是否会发生一半文件(已加载的文件)来自旧版本,其他文件来自新版本? – 2010-09-17 11:46:32

+0

我不认为你会遇到一个混合了缓存文件的情况。 ''swapCache()'只会在'status ='updateready''时运行(否则它会抛出一个错误或者只是不会做我认为的任何事情)。如果您添加了新文件,它们将通过正常机制下载,一旦完成,就会发起一个新的“更新准备”事件。我无法想象可以将不同缓存版本中的文件组合起来的场景。不知道如果我不打电话会发生什么。我认为应用程序永远不会被缓存。也许我会在本周末测试一下并回复你。 – ggutenberg 2010-09-17 13:13:34

+3

经过测试。如果未调用'swapCache()',则应用程序不会立即更新,而会在下次刷新页面时更新。所以基本上你可以给用户一个选择来更新或稍后更新。如果他们正在做某件事情,那么这是一个很好的选择。 – ggutenberg 2010-09-18 19:28:18

0

swapCache将从缓存清单中列出的上一组资源(当运行webapp加载时)切换到新组。毕竟这是为了响应updateready这样做,这表示新的清单已被加载。

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

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

12

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

如果您不在页面中进行任何动态的资源加载,则swapcache不起作用。

特别是,如果您重新加载updateready事件处理程序中的页面,则调用swapcache 首先自重新加载后无效,该页面将无论如何都会从新缓存中获取该页面。

4

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

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

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

所以applicationCache.swapCache()无需重装说:“让网页是当它被装载的方式,但现在使用任何新的资产,只要页面要求他们”。

相关问题