【发布时间】:2016-03-13 12:57:53
【问题描述】:
我正在开发一个trip planning application,它用于通过appcache 和localStorage 的组合实现离线支持。一旦 Service Worker 成为一个可行的选择,我们就开始使用它。过渡在 Chrome(Chromium、Opera 等)中顺利进行,但 Firefox(44 和 45)提出了一些问题:Firefox 注册了新的 service worker,但仍然从过时的 appcache 加载其范围内的页面。
换句话说,如果你有幸从未偶然发现过我们的网站,并且如果你在 FF 44/45 中第一次打开它,你将会得到一个新的闪亮的服务工作者来处理所有事情您的离线需求。生活很美好。
但是,如果您在启用 Service Worker 之前不幸使用了 Firefox,您的应用缓存中仍然会保留我们网站的旧版本。
- 您进入欢迎页面 - Service Worker 被激活,它(据说)负责处理整个范围内的所有事情
- 您登录,这会将您重定向到 SW 范围 (/ui) 中的页面之一 - 它仍应由 service worker 处理,但 Firefox 突然意识到它具有旧的应用程序缓存,甚至没有尝试从它从应用缓存加载旧内容的网络
如果这种情况只发生一次,我会同意的(尽管我对Mozilla docs 的阅读告诉我应该在服务工作者控制的范围内忽略 appcache)。遗憾的是,Firefox 甚至没有尝试获取清单来检查旧的 appcache 是否是最新的。如果它确实尝试 GET manifest,它会收到 404,这将使 appcache 无效(就像它在 Chrome 上所做的那样)。我在网络上(或服务器端)看不到类似的东西。
为了雪上加霜,Firefox 控制台自豪地宣布:应用程序缓存 API (AppCache) 已弃用,并将在未来删除。请考虑使用 ServiceWorker 进行离线支持。 :-)
简单刷新 (F5) 确实会通过 service worker 加载页面的当前版本。可悲的是它只工作一次。关闭并重新打开选项卡后,整个舞蹈会自行重播:服务工作者会处理范围内的所有页面除了那些曾经有 appcache 清单声明的页面。
清除应用缓存(在开发者控制台中或通过设置 UI 中的appcache clear)确实可以解决这种情况,但我无法向我们所有的 Firefox 用户建议。
我试图在 Firefox bugzilla 中找到一些东西,但运气不佳。如果有人能找到相关的问题,那就太好了。 现在我们只需要禁用对 Firefox 的软件支持。
是否有任何方式向 Firefox 发出信号,表明它在 Service Worker 范围内应该忽略旧的 appcache?
【问题讨论】:
-
理论上,如果注册了 Service Worker,Firefox 会忽略 AppCache,参见 [1] 和 [2]。您确定服务人员正在控制页面吗? [1]:bugzilla.mozilla.org/show_bug.cgi?id=1163545 [2]:fxsitecompat.com/en-CA/docs/2015/…
-
是的。理论上应该。我确信 Service Worker 处于活动状态:我可以看到在
about:serviceWorkers中注册(除了 F5 技巧类型的工作以及删除 appcache 后一切正常的事实)。我想问题的症结在于它不控制页面尽管在页面范围内处于活动状态。如果我知道如何为此编写一个简单的演示,我会这样做:问题是只有在同一浏览器中从appcache升级到service worker时才会显示。