4

如何配置 Polymer 的 Platinum-sw-cache 或 Platinum-sw-fetch 以缓存除 /_api 之外的所有 URL 路径,它是 Hoodie 的 API 的 URL?我已经配置了一个 Platinum-sw-fetch 元素来处理 /_api 路径,然后配置了 Platinum-sw-cache 来处理其余路径,如下所示:

<platinum-sw-register auto-register
                      clients-claim
                      skip-waiting
                      on-service-worker-installed="displayInstalledToast">
  <platinum-sw-import-script href="custom-fetch-handler.js"></platinum-sw-import-script>
  <platinum-sw-fetch handler="HoodieAPIFetchHandler"
                 path="/_api(.*)"></platinum-sw-fetch>
  <platinum-sw-cache default-cache-strategy="networkFirst"
                     precache-file="precache.json"/>
  </platinum-sw-cache>
</platinum-sw-register>

custom-fetch-handler.js 包含以下内容。它的目的只是以服务工作者未处理请求时浏览器的方式返回请求的结果。

var HoodieAPIFetchHandler = function(request, values, options){
  return fetch(request);
}

似乎无法正常工作的是,在用户 1 登录后,然后退出,然后用户 2 登录,然后在 Chrome 开发工具的网络选项卡中,我可以看到 Hoodie 定期继续向两个用户发出请求API 端点如下所示:

http://localhost:3000/_api/?hoodieId=uw9rl3p
http://localhost:3000/_api/?hoodieId=noaothq

相反,它应该只向其中一个 API 端点发出请求。在“网络”选项卡中,这些 URL 中的每一个连续出现两次,并且在“大小”列中,第一个请求显示“(来自 ServiceWorker)”,第二个请求以字节表示响应大小,以防万一。

另一个似乎相关的问题是,当我以用户 2 身份登录并提交表单时,应用程序会写入服务器端用户 1 的数据库。这让我认为问题是由于应用程序无法绕过 /_api 路由的缓存。

我是否应该在一个 Platinum-sw-register 元素中同时使用 Platinum-sw-cache 和 Platinum-sw-fetch,因为文档声明它们是彼此的替代品?

4

1 回答 1

3

一般来说,你正在做的应该是有效的,这是一种合法的方法。

如果发出的 HTTP 请求与 中定义的路径匹配<platinum-sw-fetch>,则将使用该自定义处理程序,并且默认处理程序(在本例中为networkFirst实现)将不会运行。HTTP 请求只能响应一次,因此不可能有多个处理程序生效。

我运行了一些本地样本并确认我的<platinum-sw-fetch>处理程序正确拦截了请求。在本地调试时,console.log()在您的自定义处理程序中添加一个并通过 Inspect 接口检查这些日志chrome://serviceworker-internals,或者使用相同的接口在您的处理程序中设置一些断点很有用。

您在受控页面的 Network 选项卡中看到的内容是预期的——Service Worker 的网络交互记录在那里,无论它们来自您的自定义处理程序HoodieAPIFetchHandler还是默认networkFirst处理程序。从受控页面的角度来看,网络交互也会被记录——它们并不总是与服务工作者的活动一一对应,因此有时记录两者确实会派上用场。

因此,我建议深入研究您的应用程序发出多个请求的原因。考虑缓存个性化资源总是很棘手,如果您最终缓存了针对不同用户的个性化资源,您可能会遇到多种麻烦。查看触发第二个/_api/请求的代码行,看看它是否来自用户注销时需要清除的缓存资源。<platinum-sw>在后台使用sw-toolbox,您可以直接在自定义处理程序脚本中使用其uncache()方法来执行缓存维护。

于 2015-06-25T09:53:50.743 回答