【问题标题】:How to make workbox cache cross origin responses?如何使工作箱缓存跨源响应?
【发布时间】:2018-08-24 01:06:09
【问题描述】:

根据workbox doc,需要配置跨域请求,保证正则表达式匹配URL开头。但是,它不起作用。

Service Worker 代码如下所示。

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.0.0/workbox-sw.js');

workbox.routing.registerRoute(
  /.*\.(png|jpg|jpeg|svg|gif)/,
  workbox.strategies.cacheFirst()
);

workbox.routing.registerRoute(
  new RegExp('^https://a248.e.akamai.net/.*'),
  workbox.strategies.cacheFirst()
);

在页面中,来自同源资源的响应被缓存,但来自https://a248.e.akami.net 的响应没有被缓存。

我的配置有什么问题吗?还是这是工作箱 3.0.0 的错误?

【问题讨论】:

    标签: progressive-web-apps workbox


    【解决方案1】:

    您的 https://a248.e.akami.net 服务器上是否启用了 CORS?如果没有,您将返回opaque responses,默认情况下,使用cacheFirst 策略时不会缓存这些内容。

    如果您想在使用 cacheFirst 策略时选择缓存这些响应,则可以使用带有配方的 guide for handling third-party requests

    workbox.routing.registerRoute(
      new RegExp('^https://a248.e.akamai.net/.*'),
      workbox.strategies.cacheFirst({
        plugins: [
          new workbox.cacheableResponse.Plugin({
            statuses: [0, 200]
          })
        ]
      }),
    );
    

    当出现这种情况时,在 localhost 中使用 Workbox v3 时,您还应该会在 JavaScript 控制台中看到一条新警告,说明发生了什么。

    【讨论】:

    • 看起来像 networkFirststaleWhileRevalidate 策略(文档版本 6.0.2)声明它们缓存不透明(这就是文档调用不支持 CORS 的响应的方式)响应,所以我们也可以用吗?
    • "默认情况下,此策略将缓存状态码为 200 的响应以及不透明响应。不透明响应是响应不支持 CORS 的跨域请求。" developers.google.com/web/tools/workbox/reference-docs/latest/…
    • 是的,您可以使用这些而无需添加CacheableResponsePlugin
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多