首页 > 解决方案 > 一个域的两个服务人员

问题描述

我有一个当前AppCache用于离线存储的 Web 应用程序。我正在尝试将此应用程序转换为使用Service Workers。我已经使用这个源作为我的基础Service Worker,除了Service Worker正在构建使用PHP以便动态生成要缓存的文件数组。

问题是,用户点击的第一个页面是登录页面,而现阶段我们对用户一无所知,所以不知道要缓存哪些资源。我AppCache通过两个清单解决了这个问题。该Login页面的一个清单和所有其他页面使用的第二个清单。当我转换为 时Service Workers,我有遵循相同模式的想法;有两个Service Workers- 一个用于登录页面,一个用于所有其他页面。

应用程序文件夹结构如下:

-- 共享 -- 页面 -- 登录 -- 第 1 页 -- 第 2 页 -- 第 3 页

登录页面和各种页面都使用Shared文件夹中的代码,因此两者的范围都Service Workers必须是应用程序的根目录。这就是问题所在。我现在发现我只能Service Worker在具有根范围的域上注册一个。Service Worker我可以在Login页面上注册第二个/Pages/Login范围,但是这将无法访问共享资源。如果我Service Worker对登录页面和其他页面都使用相同的内容,那么注册发生在登录页面上,并且生成的 url 列表不完整,因为它只包含登录使用的资源。

我很想知道是否有其他人处理过这个问题,并可以提出解决这个问题的可能方向。

标签: phpservice-workerhtml5-appcache

解决方案


服务工作者可以访问fetchscope. 这包括“更高”级别的 URL,例如您的/Shared目录,或来自完全不同来源的 URL,例如 CDN。

scope限制确定给定的 service worker 是否可以控制给定 URL 处的网页。scopeService Worker 只能控制 URL 以为前缀的网页。

因此,您可以创建多个服务工作人员,并使用匹配不同 URL 前缀的 s 注册每个服务工作人员,并且每个服务工作人员scope都可以响应fetch您的共享资源 URL 的事件。

在https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#scope_and_control有更多信息


推荐阅读