本文介绍了ServiceWorker在安装后不会立即截取呼叫的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在和ServiceWorker玩耍,我注意到即使在成功注册后,服务人员也没有截获呼叫

我的sw.js:

self.addEventListener('install', (event) => {
    console.log('install')
})

self.addEventListener('activate', (event) => {
    console.log('activate')
})

self.addEventListener('fetch', (event) => {
  console.log('fetch')
})

在我的index.html中:

...
<head>
...
<script>
    navigator.serviceWorker.register('./sw.js', { scope: './' }).then(() => {
        // just delay it so we're sure sw is active before we load that script
        setTimeout(() => {
            console.log('load jsx script to be intercepted')
            const script = document.createElement('script')
            script.setAttribute('src', 'test.js')
            document.head.appendChild(script)
        }, 2000)
    })
</script>
...
</head>
...

结果:在尚未安装Service Worker的情况下,加载第一个页面后,我的控制台输出结果为(按该顺序):

install
activate
load jsx script to be intercepted
Uncaught SyntaxError: Unexpected token '<'

语法错误是因为我正在尝试加载JSX脚本,并且我希望在服务工作进程中截取该加载,以便在执行它之前首先对其进行编译。

但是在初始加载时,服务工作器似乎没有截取,因为我没有看到日志输出‘FETCH’,尽管我清楚地看到,当我尝试加载JSX脚本时,服务工作器那时已经处于活动状态。

当我现在重新加载页面时,我得到以下控制台输出:

fetch     (<-- that's the loading of the index.html itself)
load jsx script that should be intercepted
fetch     (<-- that's the loading of the test.js)

因此,从那时起,事情按计划进行,但不是在初始加载时。为什么会这样?

推荐答案

经过研究,我似乎能够通过相关帖子here,再加上documentation of the "claim" api来解决这个问题。

因此,如果我将以下内容添加到我的"active"处理程序中,事情似乎就会正常进行:

self.addEventListener('activate', (event) => {
    event.waitUntil(self.clients.claim())

我希望得到任何关于这是否确实是正确方法的反馈:-)

这篇关于ServiceWorker在安装后不会立即截取呼叫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 23:57