service-worker - ServiceWorker 安装后不会立即拦截呼叫
问题描述
我在玩 ServiceWorkers,我注意到即使在成功注册后,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>
...
结果:当尚未安装服务工作者时,我从第一个页面加载的控制台输出是(按此顺序):
install
activate
load jsx script to be intercepted
Uncaught SyntaxError: Unexpected token '<'
语法错误是因为我正在尝试加载 JSX 脚本,并且我想在服务工作者中拦截该加载,以便在执行之前先编译它。
但是在初始加载时,服务工作人员似乎没有拦截,因为我没有看到日志输出“获取”,虽然我清楚地看到,当我尝试加载 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)
所以从那时起,事情按计划进行,但不是在初始负载上。为什么会这样?
解决方案
经过一些研究,我似乎能够使用此处的相关帖子以及“声明”api 的文档来解决问题。
因此,如果我将以下内容添加到我的“活动”处理程序中,事情似乎会奏效:
self.addEventListener('activate', (event) => {
event.waitUntil(self.clients.claim())
对于这是否确实是正确的方法,我将不胜感激:-)
推荐阅读
- reactjs - TypeError:无效的解构不可迭代实例的尝试。为了可迭代,
- python - `pip freeze` 从哪里读取信息?
- python - 检查 B 列中的值是否存在于 A 列 Python Pandas
- python - 有效计算可能发生不同情况的两个系列之间的时间增量
- javascript - Testcafe,如何单击模式弹出窗口上的按钮?
- python - 如何计算shapefile之间的比率?
- button - (Domino Notes)未设置对象变量
- c - DHT22 与 8051 接口
- pointers - 当地址不是规范形式时,我可以禁用/关闭一般保护异常吗?
- javascript - 如何使会话存储更改值