在浏览器中,同一个域下通常只能激活一个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 回复