乐闻世界logo
搜索文章和话题

可以让多个service worker同时拦截同一个获取请求吗?

4 个月前提问
3 个月前修改
浏览次数29

1个答案

1

在浏览器中,同一个域下通常只能激活一个service worker来拦截和处理请求。如果尝试注册多个service worker,新的service worker将在旧的service worker失效或被卸载后,接管其控制的页面。这是因为service worker的设计初衷是允许单一的worker控制所有的事件,避免出现多个worker对同一请求做出不同响应的情况。

每个service worker有一个特定的作用域(scope),它定义了service worker可以控制的页面。如果多个service worker的作用域重叠,那最新注册的worker将会在下次页面加载时开始控制那些页面,替换旧的worker。

然而,你可以通过分不同作用域来注册多个service worker,每个service worker控制不同作用域内的资源。这种情况下,根据不同的作用域,不同的service worker可以同时激活,但它们各自只能拦截其作用域内的请求。

举例说明

假设有如下的service worker注册:

  • sw1.js 控制 /app1/ 目录
  • sw2.js 控制 /app2/ 目录

如果用户访问 /app1/index.html,那么只有 sw1.js 可以拦截这个请求。类似地,访问 /app2/index.html 时,只有 sw2.js 会拦截这个请求。

因此,尽管可以同时激活多个service worker,但每个service worker只处理自己作用域内的请求。他们不会在同一个作用域内同时拦截同一个请求。

2024年6月29日 12:07 回复

你的答案