【问题标题】:Precedence rule for serviceworker in case of two serviceworkers有两个 serviceworker 时 serviceworker 的优先规则
【发布时间】:2016-03-01 13:46:18
【问题描述】:

我计划有两个服务人员。但是一个的范围是另一个的子集。

例如:一个是 '/'

其他是'/images'

现在我正在注册来自不同地方的两个服务人员。 我的疑问是,当两个 serviceworker 都在场并且浏览器向 /images 发送请求时,哪个 serviceworker 会拦截它,因为它在两个 serviceworker 的范围内。

浏览器是否优先考虑更专业的范围?

编辑:这是我注册两个 Service Worker 的代码。现在我想在第一次调用“/”时注册两个 Service Worker。

if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register(serviceWorkerEndpoint1, { scope: serviceWorkerScope1 }).then(function (registration) {
            Log.Log('ServiceWorker registration successful with scope: ' + registration.scope, "ServiceWorker1Installed", "ServiceWorkerInstalled");
        }).catch(function (err) {
            Log.Log('ServiceWorker registration failed: ' + err, "ServiceWorkerInstalled", "ServiceWorkerInstalled");
            });   

        navigator.serviceWorker.register(serviceWorkerEndpoint2, { scope: serviceWorkerScope2 }).then(function (registration) {
            Log.Log('ServiceWorker registration successful with scope: ' + registration.scope, "ServiceWorker2Installed", "ServiceWorkerInstalled");
        }).catch(function (err) {
            Log.Log('ServiceWorker registration failed: ' + err, "ServiceWorker2Installed", "ServiceWorkerInstalled");
        });           
    }

【问题讨论】:

    标签: service-worker


    【解决方案1】:

    两者都有效,但每个范围只有一个处于活动状态,因此浏览器会优先选择最具体的一个。我给你一个设置来验证(虽然我自己试过):

    文件夹结构:

    .
    ├── images
    │   └── sw-images.js
    ├── index.html
    └── sw.js
    

    在 ./images/sw-images.js 中:

    self.onfetch = event => {
      if (event.request.url.indexOf('content') != -1)
        event.respondWith(new Response('Hi from images'));
    };
    

    在 ./sw.js 中:

    self.onfetch = event => {
      if (event.request.url.indexOf('content') != -1)
        event.respondWith(new Response('Hi from root'));
    };
    

    在 index.html 中:

    <script>
      Promise.all([
        navigator.serviceWorker.register('sw.js', { scope: '/'}),
        navigator.serviceWorker.register('images/sw-images.js', { scope: 'images/' })
      ])
      .then(() => console.log('All right!'))
      .catch(error => console.error(error)); 
    </script>
    <a href="content.html">./content.html</a>
    <a href="images/content.html">./images/content.html</a>
    

    【讨论】:

    • 我知道这很奇怪,但对我来说,具体的是提供通用 url,就像为 /image 注册的 serviceworker 正在拦截 /.可能是什么原因?
    • 你用过这个设置吗?我可以看一下代码吗?
    • 我已经在我的问题部分添加了我的代码,请看一下。现在发生的事情是,它正在为第一个注册的 SW(在 chrome 中)打开一个新的开发人员选项卡,它正在暂停第一行。第二行工作正常。但第一行不工作。我必须手动单击它才能激活。
    • 可能其中一位服务人员没有注册。在 Chrome 的 chrome://serviceworker-internals/ 中可以看到注册了哪个 sw。检查那里的两个软件都已注册。如果没有,请向我们展示您的 Service Worker 端点和范围。
    • 我不明白您所说的手动点击是什么意思,抱歉。你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多