如何配置Polymer的platinum-sw- *以不缓存一个URL路径?

时间:2015-06-25 04:07:56

标签: polymer service-worker hoodie

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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/unityView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
</FrameLayout>

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

f(x,y)=0 if [0,a),
f(x,y)=(255/(a-b))-a for [a,b],
f(x,y)=255 if (b,255]

似乎无法正常工作的是,在用户1登录后,然后退出,然后用户2登录,然后在Chrome开发工具的网络标签中,我可以看到连帽衫定期继续向两个用户的API端点如下:

<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>

相反,它应该仅向这些API端点中的一个发出请求。在“网络”选项卡中,每个URL连续出现两次,在“大小”列中,第一个请求显示“(来自ServiceWorker)”,第二个请求以字节为单位表示响应大小,如果相关的话。 / p>

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

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

1 个答案:

答案 0 :(得分:3)

一般来说,你所做的事情应该有效,这是一种合法的方法。

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

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

您在受控页面的“网络”标签中看到的内容是 - 服务工作者的网络交互记录在那里,无论它们来自您的自定义HoodieAPIFetchHandler还是默认的networkFirst处理程序。从受控页面的角度来看,网络交互也会被记录下来 - 它们并不总是与服务工作者的活动一一对应,所以记录这两者确实有时会派上用场。

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