【问题标题】:How to handle URLs that aren't controlled by a service worker如何处理不受服务人员控制的 URL
【发布时间】:2016-02-25 20:54:17
【问题描述】:

我对 service worker 的策略是,如果 url 匹配某种特定格式,那么只有 service worker 应该拦截它,否则浏览器应该像往常一样处理它,

对于所有情况,我都使用 evt.respondWith() 来拦截它并提供自定义响应,但是如果 url 与任何格式都不匹配,我该怎么办

我有几个选项,所有选项都有效,但我不确定哪一个在逻辑上是正确的

1) 什么都不做,意味着我有 if 条件来检查 fetch 方法中定义的每个格式,但如果它们不匹配,我什么都不做,我没有任何“else”条件。在这种情况下,浏览器正在获取页面正常,但我不确定它是否正确,实际发生了什么,cookie 是否通过?

2) 在 else 方法中我有 fetch(event.request, { credentials: 'include' }); 这也有效,我不确定是否需要在此处包含凭证子句,据我了解,不是服务工作者,而是浏览器在此处处理请求,因此它将自动包含 cookie。如果我在这里错了,请纠正我。

3)event.respondWith(fetch(event.request, { credentials: 'include' }));

这也有效,我认为因为我使用的是 event.respondWith,所以我需要明确地包含凭证(我再次不确定)。但我怀疑我是否需要在这里使用 event.respondWith。我对event.respondWith的了解是,只有当我们想为获取事件提供自定义响应时才使用它。由于我们希望按原样处理这些请求,我们是否需要在这里使用event.respondWith

我所有的困惑都来自我对event.respondWith() 缺乏了解,有人可以解释一下,我应该什么时候使用 吗?

【问题讨论】:

    标签: service-worker fetch-api


    【解决方案1】:

    event.respondWith 允许您使用您创建的响应来响应网络请求(使用fetchCache API,甚至使用Response constructor 手动创建)。

    如果您不在fetch 事件处理程序中调用它,浏览器将处理该请求。

    如果你用fetch(event.request) 调用它,它基本上和让浏览器处理它是一样的(因为fetch 将执行与你没有调用event.respondWith 时浏览器会执行的请求完全相同的请求) .

    请注意,event.respondWith 将使用您传递给它的值或您传递给它的 Promise 解析为的值进行响应。

    event.respondWith(new Response('Some body.'));
    
    event.respondWith(new Promise(function(resolve, reject) {
      setTimeout(function() {
        resolve(new Response('Some body.'));
      }, 1000);
    }));
    

    【讨论】:

    • 如果我什么都不做(没有 fetch(event.request)),那么浏览器也会处理请求,这是暗示吗? 1,2,3 中哪一个最合适?以及包含凭证的规则是什么,我应该什么时候包含它?对于 2 或 3 或两者?
    • 是的,如果您不调用它,浏览器将处理该请求。我认为没有“合适的”,他们都是正确的。您不需要使用credentials 参数,它是浏览器已经设置的请求(event.request)的属性。
    • 即使我使用 event.respondWith() 也不需要包含它?那么我们究竟什么时候需要这个参数呢?
    • @user17981 在这种情况下你不需要它,因为请求对象是由浏览器本身创建的,你只是想做浏览器想要的。如果您自己创建请求,那么您需要决定是否要包含 cookie。
    • 值得注意的是,判断是否调用event.respondWith()的逻辑需要同步。实际上,这意味着 URL 比较之类的东西很好,但是任何需要异步使用 Cache Storage 或 IndexedDB API 的东西都行不通。见github.com/GoogleChrome/samples/blob/gh-pages/service-worker/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2020-01-11
    相关资源
    最近更新 更多