长时间等待 Service Worker 的请求

Posted

技术标签:

【中文标题】长时间等待 Service Worker 的请求【英文标题】:Long time waiting Request to Service Worker 【发布时间】:2017-10-21 17:25:11 【问题描述】:

我注意到等待服务工作人员响应缓存中的项目的时间并不像您预期​​的那么快。我看到sw-precache 和自定义书面服务人员的等待时间相同。

这个等待时间的可能原因是什么?我该如何减少它?

我在自定义服务工作者上的fetch 事件如下所示:

self.addEventListener('fetch', function(event) 
    event.respondWith(
        caches.match(event.request).then(function(response) 
            if (response) 
                return response;
            
            return fetch(event.request);
        )
    );
);

【问题讨论】:

是否缓存了大量内容? 我不会这么说的。在一个应用程序中,我有 6 个项目,在另外 14 个项目上。在检索图像时,我在 ifixit app 上也注意到了同样的情况,但现在无法复制它。 我猜这要么是 Chrome 中的错误,要么是您计算机上的性能限制。 您找到解决方案了吗? 我这里也有同样的问题。你找到解决办法了吗? 【参考方案1】:

您是否在应用程序 -> Service Worker 选项卡下的 Chrome 开发工具中检查了“重新加载时更新”?

如果是这样,那么我认为这可能是问题所在,因为它会在每次重新加载时重新运行您所有的 Service Worker 代码,这在使用 sw-precache 时可能是相当多的代码。

【讨论】:

不,事实并非如此。 “重新加载时更新”未选中。 我的应用就是这种情况。我检查了Disable Cache,这使服务人员花费了很长时间。当我禁用它时,一切又恢复了正常。 这也没有解决我的问题。即使禁用了“禁用缓存”,加载页面也需要一分钟。【参考方案2】:

事件虽然我无法回答这个奇怪的等待时间的可能原因,但我知道如何减少它。

我们可以使用 event.respondWith() 在 service worker 中拦截一个 fetch 事件。不知何故,在我的情况下,当我的页面需要通过脚本标签加载供应商的 javascript 时,我的服务工作者默认拦截每个 fetch 事件以执行缓存然后网络(用于资产)或仅网络(用于数据获取)像这样:

if (shouldLoadOfflinePage) 
    fetchEvent.respondWith(cacheManager.fromCache(new Request(offlinePage)));
 else if (shouldFromCache) 
    fetchEvent.respondWith(cacheManager.fromCache(fetchEvent.request));
 else 
    fetchEvent.respondWith(fetch(fetchEvent.request));

最后一个块拦截了一个完全没有必要做的纯网络请求。这个不必要的阻塞会以某种方式导致阻塞负载(但我不知道是什么阻塞了它):

long request to serviceworker wait time: ~400ms

所以我决定不拦截不必要的获取拦截(当然是通过删除最后一个块):

if (shouldLoadOfflinePage) 
    fetchEvent.respondWith(cacheManager.fromCache(new Request(offlinePage)));
 else if (shouldFromCache) 
    fetchEvent.respondWith(cacheManager.fromCache(fetchEvent.request));

那么我的页面只需要 16ms 就可以加载上述文件。

希望这会有所帮助

【讨论】:

如何设置“shouldLoadOfflinePage”和“shouldFromCache”变量?此代码在 service worker js 的 fetch 事件上?【参考方案3】:

清除 indexedDB 将有助于减少“请求 Service Worker”所需的时间。可以通过js删除:

indexedDB.deleteDatabase(location.host);

或手动操作:

/用户/[用户名]/库/应用程序 支持/Google/Chrome/默认/IndexedDB/

【讨论】:

以上是关于长时间等待 Service Worker 的请求的主要内容,如果未能解决你的问题,请参考以下文章

在循环中等待长时间运行的代码块

BACKGROUNDWORKER的用法?

AWS Elastic Beanstalk Worker 在长时间计算期间不活动后超时

Service Worker概念和应用介绍

主线程和worker分离

Excel 等待很长时间才能开始保存文档