一个域的两个服务工作者

Two service workers for one domain

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

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

应用文件夹结构是这样的:

-- 已分享 -- 页面 - 登录 -- 第1页 - 第2页 -- 第3页

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

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

服务人员可以在其 scope 之外的 URL 秒内访问资源(即响应 fetch 事件)。这包括“更高”级别的 URLs,例如您的 /Shared 目录,或来自完全不同来源的 URLs,例如 CDN。

scope 限制决定了给定的服务工作者是否可以 控制 给定 URL 的网页。 Service Worker 只能控制 URL 以 scope 作为前缀的网页。

因此您可以创建多个服务工作者,并为每个服务工作者注册匹配不同 URL 前缀的 scope,并且它们每个都可以响应您共享的 fetch 事件资源 URLs.

https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#scope_and_control

上有更多信息