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

我可以同时拥有Workbox寄存器路由和Service Worker获取事件处理程序吗?

萧韬
2023-03-14

我正在构建一个PWA应用程序,我已经为一些apiendpoint使用了workbox registerroute,以及一个显式的服务工作者获取事件侦听器。在调试一些缓存问题时,我注意到这两个问题似乎相互干扰。具体来说,有时不会触发fetch处理程序—这会给调试带来麻烦—我假设这是由于我通过workbox设置的registerroute缓存策略造成的。

我的问题是,我可以只选择其中一个,而不是同时使用fetch处理程序和registerroute吗?在我的例子中,我需要FetchHandler来处理一些与POST请求相关的高级缓存。因此,我认为如果我只能选择一个,我将不得不坚持使用fetch处理程序。

共有1个答案

邢嘉祯
2023-03-14

首先,这里有一些关于active service worker中有多个fetch事件处理程序时会发生什么的背景信息。

考虑到这些背景信息,有几种方法可以实现您所描述的内容。

只要您先注册自己的fetch处理程序,然后再调用Workbox的registerRoute(),就可以保证在响应传入的fetch事件时有“第一枪”。

需要记住的是,您自己的fetch处理程序需要同步决定是否html" target="_blank">调用事件。respondWith(),以及何时调用事件。respondWith(),则Workbox的路由将不用于响应给定的请求。

因此,您可以执行以下操作:

self.addEventListener('fetch', (event) => {
  // Alternatively, check event.request.headers,
  // or some other synchronous criteria.
  if (event.request.url.endsWith('.json')) {
    event.respondWith(customResponseLogic(event));
  }
});

// Then, include any Workbox-specific routes you want.
registerRoute(
  ({request}) => request.destination === 'image',
  new CacheFirst()
);

// The default handler will only apply if your own
// fetch handler didn't respond.
registerDefaultHandler(new StaleWhileRevalidate());

这类似于1a,但主要的事情是确保您没有一个“包罗万象”的路由来匹配所有的请求,并且您不使用寄存器DefaultHandler()

假设你的Workbox路由只匹配一组特定的定义良好的标准,而不匹配你想要在你自己的处理程序中响应的任何请求,那么你如何排序就不重要了:

// Because this will only match image requests, it doesn't
// matter if it's listed first.
registerRoute(
  ({request}) => request.destination === 'image',
  new CacheFirst()
);

self.addEventListener('fetch', (event) => {
  // Alternatively, check event.request.headers,
  // or some other synchronous criteria.
  if (event.request.url.endsWith('.json')) {
    event.respondWith(customResponseLogic(event));
  }
});

(在“引擎盖下”发生的事情是,如果没有一个路由的同步匹配处理程序返回真实值,Workbox的路由将不会调用事件。respondWith()

使用Workbox处理所有路由应该是可行的,并在handlerCallback(更简单)或Strategy基类的自定义子类中运行自定义响应生成代码(更可重用,但简单使用会过头案例)。

需要记住的一点是,如果您处理POST请求,您需要明确地告诉registerRoute()响应它们,方法是将'POST'作为(可选)第三个参数传入。

下面是一个示例,说明了如何执行此操作,假设您的自定义逻辑是在customResponseLogic()函数中定义的:

registerRoute(
  ({request}) => request.destination === 'image',
  new CacheFirst()
);

registerRoute(
  // Swap this out for whatever criteria you need.
  ({url}) => url.pathname.endsWith('.json'),

  // As before, this assumes that customResponseLogic()
  // takes a FetchEvent and returns a Promise for a Response.
  ({event}) => customResponseLogic(event),

  // Make sure you include 'POST' here!
  'POST'
);
 类似资料:
  • 目前我们正在使用Axon 2。我们想把Axon 2升级到4。我们使用Axon 2订阅带有重放选项的事件处理器。在Axon 4中,一个显著的区别是跟踪事件处理器。看来,跟踪处理器是重播的必备。有可能拥有订阅和跟踪事件处理器吗?有没有可能把跟踪处理器只用于重放,剩下的就不管了?还是必须改变整个结构?

  • 我们有一个使用Disruptor框架的系统,它有五个注册阶段来实现EvenetHandler。 阶段按顺序工作,因此请求只能在第一阶段完成时移动到第二阶段,该移动由Disruptor内部维护。 我们对第三阶段有问题,这是瓶颈,需要大量时间,因为它进行不同的HTTP调用并将响应存储在请求对象中。 因此,我们希望在第三阶段花了一段时间之后,将请求(无论有什么响应)提前到第四和第五阶段。 如何超时任何特

  • 本文向大家介绍HTML5 / JS存储事件处理程序,包括了HTML5 / JS存储事件处理程序的使用技巧和注意事项,需要的朋友参考一下 仅当存储事件由另一个窗口触发时,才会触发存储事件处理程序。您可以尝试运行以下代码:

  • 我试图了解和之间的区别。如果需要创建更新资源的路由,例如,是否应该同时实现和? 如果可以使用部分更新资源,为什么要使用?

  • 问题内容: https://cloud.google.com/appengine/docs/go/users/ 我在这里看到他们没有指定使用任何路由器…:https : //cloud.google.com/appengine/docs/go/config/appconfig 在与Golang一起使用的Google Cloud中,它表示要在中指定每个处理程序。这是否意味着我们不应该使用第三方路由器

  • 必需的URL:https://learn . Microsoft . com/en-us/azure/active-directory/develop/application-consent-experience https://login.microsoftonline.com/common/adminconsent?客户端id = {应用程序Id} 请帮帮忙