我正在尝试从 AppCache 迁移到大型框架的 Service Worker(构造 2 - 请参阅 www.scirra.com)。很容易找到如何使用 Service Worker 缓存资源列表,然后在 fetch 事件中响应缓存条目的示例。但是,我发现 AppCache 的两个功能很难用 Service Worker 复制:
- 自动缓存主页。
- 通过在主页加载时请求单独的文件 (offline.json) 检查更新。
这两个都需要识别索引页(#2 将在请求索引页的同时检查更新)。但是,我发现自己陷入了看似不雅的解决方案。请注意,如果请求“foo/”,许多服务器会返回“foo/index.html”,但其他服务器不会,还有一些使用动态路径,因此我无法列出任何硬编码的主页 URL。我必须通过当前页面的 URL。
对于#1,我在“安装”事件中跳过Waiting(),在“激活”中声明()客户端,clients.matchAll()迭代每个客户端,然后将client.url添加到缓存中。这似乎有点啰嗦,有没有办法在“安装”事件中获取主页 URL?
对于 #2,我必须在每个 fetch 事件中调用 clients.matchAll() 并测试当前请求 URL 是否与任何客户端 URL 匹配。如果它是主页,我会检查更新,否则正常处理。这看起来很不优雅,因为在页面加载时发生的数百个 fetch 请求中的每一个都必须不断获取所有客户端的列表并匹配它们的 URL。
有没有更好的方法从服务人员那里获取主页的 URL?