【问题标题】:Dynamic Caching using Workbox使用 Workbox 进行动态缓存
【发布时间】:2018-06-08 00:51:25
【问题描述】:

我正在使用工作箱路由进行动态缓存。我不想给出修复 url,因为它会根据用户交互而改变。我怎样才能做到这一点?我像下面这样使用它,但它被固定在一个状态

let BASE_URL = location.protocol + "//" + location.host,
    API_URL = BASE_URL + '/ab/abc/api/'

我想缓存所有具有 /ab/abc/api/ 的 url

workbox.routing.registerRoute(API_URL, workbox.strategies.networkFirst({
  cacheName: 'abc',
  plugins: [
    new workbox.expiration.Plugin({
      maxEntries: 1
    }),
    new workbox.cacheableResponse.Plugin({
      statuses: [200]
    })
  ]

}));

【问题讨论】:

    标签: service-worker workbox


    【解决方案1】:

    in the documentation 提供了有关 Workbox 路由工作原理的更多背景信息。

    不过,要回答您的具体问题,您可以创建一个基于正则表达式匹配的路由,并且该正则表达式只需要匹配传入 URL 的一部分(例如,匹配公共前缀或后缀)。

    假设您的公共前缀是 /ab/abc/api/,并且您的实际 API 调用是针对该路径下存在的 URL(例如 /ab/abc/api/entries/ab/abc/api/latest?t=1 等),您可以创建如下路由:

    workbox.routing.registerRoute(
      new RegExp('/ab/abc/api'),
      workbox.strategies.networkFirst({
        cacheName: 'abc',
        plugins: [
          new workbox.expiration.Plugin({
            maxEntries: 50
          })
        ]
    }));
    

    我在那里更改的另一件事是maxEntries 用于缓存到期。每个与 RegExp 匹配的唯一 URL 都将获得自己的缓存条目,如果您将 maxEntries 设置为 1,那么您最终只会缓存最后使用的 URL,而所有其他条目在每次之后都过期。我假设将它设置为更高的值(我使用了 50,但对你来说任何有意义的值)更符合你的意图。

    【讨论】:

    • 感谢您的澄清!但在我的情况下,url xyz.xy.xom 会根据 env 发生变化,所以我正在使用基本 url BASE_URL = location.protocol + "//" + location.host 并使用 /ab/abc/api 添加它。所以我把它存储在var中。如果我只使用 /ab/abc/api 它仅在用户访问特定模块时缓存 url。如果 url 有 htttps://xyz.xy.com/xy/xyz/xy/xyz/xy-xyz-xyz?startDate=01/06/2018&endDate=11/06/2018,这里的日期会改变。那么我们在工作箱中有什么选项可以处理吗?
    • 您可以构建一个任意复杂的RegExp,并包含像^ 这样的元字符以匹配URL 的开头。或者,您可以创建自己的matchCallback,它将在运行时使用您想要的任何逻辑(而不是RegExp)来确定Route 是否匹配。见developers.google.com/web/tools/workbox/reference-docs/latest/…
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多