简体   繁体   English

服务工作者:Fetch事件侦听器仅在页面重新加载后才起作用

[英]Service worker: Fetch event listener only works after page reload

I have added a service worker to my page with the code below. 我已经在我的页面中添加了一个服务工作者,其代码如下。 It works well once the page has been reloaded and the worker already installed. 一旦重新加载页面并且已经安装了工作程序,它就能很好地工作。 But does not seem to catch any fetch events before the page is reloaded after I have seen the 'SW INSTALL' log. 但在看到“SW INSTALL”日志后,在重新加载页面之前似乎没有捕获到任何获取事件。

app.js app.js

navigator.serviceWorker.register('/worker.js').then((registration) =>
{
    console.log('ServiceWorker registration successful with scope: ', 
registration.scope);
}, (err) =>
{
    console.log('ServiceWorker registration failed: ', err);
});

worker.js worker.js

self.addEventListener('install', function (event)
 {
    console.log("SW INSTALL");
 });

self.addEventListener('fetch', function (event)
{
    console.log("FETCHING", event);
    event.respondWith(
            caches.match(event.request)
                    .then(function (response, err)
                            {
                                // Cache hit - return response
                                if (response)
                                {
                                    console.log("FOUND", response, err);
                                    return response;
                                }
                                console.log("MISSED", event.request.mode);
                                return fetch(event.request)
                            }
                    )
    );
});

Solution: Adding the following to worker.js; 解决方案:将以下内容添加到worker.js;

self.addEventListener('activate', function (event)
{
    event.waitUntil(self.clients.claim());
});

Service workers don't immediately “claim” the sessions that load them, meaning that until your user refreshes the page your service worker will be inactive. 服务工作人员不会立即“声明”加载它们的会话,这意味着在您的用户刷新页面之前,您的服务工作人员将处于非活动状态。

The reason for this is consistency, given that you might otherwise end up with half of your webpage's assets cached and half uncached if a service worker were to come alive partway through your webpage's initialization. 这样做的原因是一致性,因为如果服务工作者在网页的初始化过程中活跃起来,你可能会以一半的网页资产进行缓存,一半不缓存。 If you don't need this safeguard, you can call clients.claim and force your service worker to begin receiving events 如果您不需要此安全措施,可以调用clients.claim并强制您的服务工作人员开始接收事件

Read more @ service-workers 阅读更多@ service-workers

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM