当前位置: 首页 > 知识库问答 >
问题:

强制服务工作者仅在特定页面打开时返回缓存响应

景志
2023-03-14

我已经建立了一个门户网站,它提供了对几个功能的访问,包括故障单功能。

客户要求我使故障单功能离线可用。他们希望能够在线时“查看”特定的现有门票,当用户的设备不在任何互联网连接的范围内时,这些门票可以访问(查看/编辑)。此外,他们希望能够在离线时创建新的门票。然后,当连接可用时,他们将签入更改/新创建的票证。

我一直在对服务人员进行修补,并查阅了一些关于他们的好文档,我觉得我对如何缓存数据有了基本的了解。

但是,因为我只想使门户的票务部分脱机可用,所以我不希望服务人员在访问门户的任何其他页面时缓存或返回缓存的数据。所有页面都在同一个目录中,因此服务工作者在加载后,默认情况下将拦截来自门户中所有页面的所有请求。

如何将服务辅助角色设置为仅在门票页面打开时使用缓存数据进行响应?

发生读取事件时,是否必须手动检查window.location值?例如,

if (window.location == 'https://www.myurl.com/tickets')
{
    // try to get the request from network. If successful, cache the result.
    // If not successful, try returning the request from the cache.
}
else
{
    // only try the network, and don't cache the result.
}

需要为页面加载许多支持文件(即css文件、js文件等)。)所以仅仅检查页面名称的request.url是不够的。在Service Worker事件中是否可以访问window.location,这是否是实现此目的的合理方法?

共有1个答案

公羊灿
2023-03-14

我知道你提到你目前所有的页面都来自同一个目录。。。但是,如果您对web应用程序的URL结构有任何灵活性,那么最干净的方法就是从以唯一路径前缀开头的URL(如/tickets/)提供票证功能,然后从/tickets/service worker托管您的服务人员。js。重新组织URL的努力可能是值得的,如果这意味着能够利用默认的服务工作者范围,而不必担心/tickets/之外的页面被服务工作者控制。

此答案中包含有关确定引用的窗口客户端URL来自服务人员的获取处理程序的信息。您可以将其与fetch处理程序中的初始检查结合起来,查看它是否是导航请求,并使用它提前退出。

const TICKETS = '/tickets';
self.addEventListener('fetch', event => {
  const requestUrl = new URL(event.request.url);
  if (event.request.mode === 'navigate' && requestUrl.pathname !== TICKETS) {
    return;
  }

  const referrerUrl = ...; // See https://stackoverflow.com/questions/50045641
  if (referrerUrl.pathname !== TICKETS) {
    return;
  }

  // At this point, you know that it's either a navigation for /tickets,
  // or a request for a subresource from /tickets.
});
 类似资料:
  • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。

  • 我正在侦听服务工作者中的获取事件,想知道何时缓存对获取的响应? 1)当Fetch事件被触发时?PreventDefault()停止它?2)我是否需要缓存:无存储在我的INIT参数到我的FETCH调用?3)它发生在event.respondwith()时间吗? 我有一个数据交付策略,寻求交付尽可能新鲜的数据,只有在网络很慢的情况下才去缓存。但即使如此,只要缓存完成,网络抓取仍然运行以更新缓存。 如果

  • 我建立了一个进步的网络应用,https://www.tavest.com.我不明白为什么我的服务人员也被缓存在Chrome中?https://www.tavest.com/service-worker-tavest.js因此,当我更改服务人员时,chrome没有检测到更改,因此服务人员没有更新。 尽管我刷新了很多次页面,它仍然是一样的。然而,在Mozilla中,它工作得很好。这是我安装服务人员的代

  • 我使用sw-precache生成Polymer-CLI构建过程中的服务工作,因此它旨在更新更新文件的散列,以表示需要更新缓存。但是缓存中没有替换我更新的内容,因此如果我使用ctrl-r刷新,它将获得旧版本,但如果使用ctrl-shift-r刷新,它将获得新版本。原因可能是我的服务人员没有更新。 这份文件说 如果与当前相比,服务辅助程序文件中甚至有一个字节的差异,它就认为它是新的。 ,但如果我的新服

  • 我们在reactjs应用程序中安装了离线插件,该应用程序使用service worker缓存构建文件,未检查新构建的任何更新,因此,具有旧构建的用户仍在使用service worker中的缓存数据访问旧站点。这些文件没有过期设置,所以我想知道是否有任何解决方案可以强制用户刷新页面或将更新推给用户? 我在新版本中进行了更新,没有缓存头,离线插件自动更新,但我仍然无法找到将此更新推送到旧用户文件的方法

  • 我有一个使用服务人员和缓存API的应用程序。Service Worker中使用的缓存名称包含GIT修订版(哈希),因此每次发布时,都会使用新缓存,删除旧缓存。这是为了百分之百地确保用户总是能够获得最新的源代码(这种情况对于预期的发布计划来说很好)。 我使用的是每天运行几次的Selenium Java(WebDriver)测试(比如GIT repo发生变化时),我希望确保每个新的GIT版本都能正确地