【问题标题】:Ignore ajax requests in service worker忽略服务工作者中的 ajax 请求
【发布时间】:2016-02-23 06:28:28
【问题描述】:

我有一个带有 HTML、CSS 和 JS 基本“外壳”的应用程序。页面的主要内容是通过对 API 的多个 ajax 调用加载的,该 API 位于我的应用程序正在运行的另一个 URL 上。我已经设置了一个 service-worker 来缓存应用程序的主“shell”:

var urlsToCache = [
  '/',
  'styles/main.css',
  'scripts/app.js',
  'scripts/apiService.js',
  'third_party/handlebars.min.js',
  'third_party/handlebars-intl.min.js'
];

并在请求时以缓存版本响应。我遇到的问题是我的 ajax 调用的响应也被缓存了。我很确定我需要向 service-worker 的 fetch 事件添加一些代码,这些代码总是从网络中获取它们而不是在缓存中查找。

这是我的fetch 活动:

self.addEventListener('fetch', function (event) {
    // ignore anything other than GET requests
    var request = event.request;
    if (request.method !== 'GET') {
        event.respondWith(fetch(request));
        return;
    }

    // handle other requests
    event.respondWith(
        caches.open(CACHE_NAME).then(function (cache) {
            return cache.match(event.request).then(function (response) {
                return response || fetch(event.request).then(function (response) {
                    cache.put(event.request, response.clone());
                    return response;
                });
            });
        })
    );
});

我不确定如何忽略对 API 的请求。我试过这样做:

if (request.url.indexOf(myAPIUrl !== -1) {
  event.respondWith(fetch(request));
  return;
}

但根据 Chrome 开发工具中的网络选项卡,所有这些响应仍然来自 service-worker。

【问题讨论】:

  • 为什么不表明响应来自服务人员?另外,您可以使用string.includes

标签: service-worker


【解决方案1】:

您不必使用event.respondWith(fetch(request)) 来处理您想忽略的请求。如果你没有调用event.respondWith就返回浏览器会为你获取资源。

你可以这样做:

if (request.method !== 'GET') { return; }
if (request.url.indexOf(myAPIUrl) !== -1) { return; }

\\ handle all other requests
event.respondWith(/* return promise here */);

IOW 只要您可以同步确定您不想处理请求,您就可以从处理程序返回并让默认请求处理接管。 Check out this example.

【讨论】:

  • 谢谢,我已经完成了。当我查看 Chrome Devtools 的网络选项卡时,我看到每个请求两次:一次成功,但另一个失败,状态为 (Service Worker Failback)。知道这是为什么吗?
  • 有趣。我在our site 上没有看到(至少我认为我没有看到)。可能是@jeff-posnick 可以插话:看看他的somewhat related response - 你能用example gist mentioned there 重现这种行为吗?
猜你喜欢
  • 2021-08-07
  • 2014-02-14
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2019-06-12
  • 2020-05-26
  • 2011-12-26
相关资源
最近更新 更多