【问题标题】:Two service workers for one domain一个域的两个服务人员
【发布时间】:2021-02-14 19:35:10
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我猜你仍然可以从嵌套的服务工作者范围内访问共享资源。

标签: php service-worker html5-appcache


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2015-05-02
    相关资源
    最近更新 更多