5

我创建了一个 Web 应用程序,它缓存了所有必要的代码和数据,以便通过 applicationCache 离线使用。但是,每次应用程序启动时,它都会立即尝试检查更新。这会在很长一段时间内阻止浏览器,即使它没有找到任何要更新的内容。这种行为对应用程序有很大的破坏性(不应该在后台进行更新吗?)。只是检查阶段在移动设备上需要很多时间,如果它发现更新,那么所有关于下载需要多长时间的赌注都没有了(b/c 它必须重新下载所有文件)——这也会冻结浏览器。

所以,我想知道:

  1. 有没有办法将 applicationCache 更新委托给共享的 Web Worker?或者
  2. 有没有办法阻止所有 applicationCache 更新,直到用户特别想要检查更新并按下将通过 applicationCache.update() 启动更新的按钮?或者
  3. 还有其他方法可以减少检查更新所花费的时间吗?
  4. 应用程序缓存更新不应该在后台异步运行吗?



编辑:也许清单文件上精心构建的缓存控制标头是答案?我将对此进行调查,但我希望有人能给我有关这些更新的更多信息。谢谢。


更新

好的,我玩过头球,但没有任何帮助。我开始赏金了。如果你能帮忙,请做!

4

2 回答 2

1

If you want to give the user more control over the actual update, you could parameterise the manifest URL with something specific to that user. Then when the user wants to update, you fire off a request to the server which rolls that particular user's manifest file, and then reload the page client-side to force a reload of the manifest.

I've since been doing some reading and came across this article which seems to be a much more elegant solution if the user is already on the cached page -

http://www.html5rocks.com/tutorials/appcache/beginner/#toc-updating-cache

As for the load time involved in the manifest up-to-date check, that's not something I've ever had a problem with. My understanding was that it happens in the background, are you just concerned about the browser showing loading hints?

于 2011-05-30T16:18:55.640 回答
0

abort()方法可能是答案……总有一天,但我还没有遇到任何实现它的浏览器。

我遇到了类似的问题,并尝试了一切,包括将清单放入自身以查看它是否会缓存自己的疯狂想法。因此,我可以使用 ajax 请求手动进行更新,并对塞入 localStorage 的 javascript 进行评估……哎呀。

最后,我用一个简单的清单创建了一个非常简单的 html 页面。当我测试它时,用户界面没有锁定。慢慢地,我开始在页面中添加东西,并使用清单内容来查看在 applicationCache 检查期间可能导致它冻结的东西。当我将图像添加到页面时,我终于失败了,但将其排除在清单之外 - 那是 UI 再次开始锁定的时候。我回到我原来的项目,发现了一些需要在清单中的图像,这也解决了那里的锁定 UI 问题。

applicationCache 的检查阶段尝试异步(至少在我测试过的设备上)。但是,如果清单中缺少任何文件,那么一切都必须等待 applicationCache 完成检查

看起来,当浏览器需要一个尚未缓存的文件时它会等待 applicationCache 完成更新,然后才会请求该文件——这是有道理的,因为其他资源可能依赖于丢失的文件. 这会阻止渲染并使 UI 冻结。如果清单无法访问(例如在不同的网络上),则 UI 可能会被锁定大约一分钟。

要查找需要添加到清单中的文件,请在刷新应用程序几次时查看服务器日志。嫌疑人将是对清单以外文件的任何 GET 请求。

于 2011-09-08T18:41:56.200 回答