2015-06-25 35 views
4

如何配置Polymer的platinum-sw-cache或platinum-sw-fetch来缓存除/ _api(这是Hoodie的API的URL)以外的所有URL路径?我已经配置了一个铂-SW-取元素来处理/ _api路径,则铂-SW-cache来处理路径的其余部分,如下所示:如何配置Polymer的铂-sw- *不缓存一个URL路径?

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

定制取入handler.js包含下列。其目的仅仅是如果服务工作人员不处理请求,则以浏览器的方式返回请求的结果。

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

似乎什么东西不能被正确的工作是,用户1已经签署后,再2个迹象退出,则用户,然后在Chrome浏览器开发工具网络选项卡,我可以看到帽衫定期继续向两个用户的API端点发出请求,如下所示:

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

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

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

我是否应该在一个铂-sw-寄存器元素中使用铂-sw-高速缓存和铂-sw-提取,因为这些文档声明它们是彼此的替代品?

+0

刚刚有类似的工作。这有帮助。谢谢。 – jptknta

回答

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来执行缓存维护。

+0

我把console.log()和调试器语句放在我的自定义处理函数内部和外部,未注册服务工作者实例,关闭并重新打开选项卡,并且在chrome:// serviceworker-internals日志中看不到那些日志消息,调试器也不会在我的调试器语句中暂停执行。我如何验证自定义处理程序是否正在运行? – timblack1

+0

我的问题是我创建了两个连帽衫的例子。我将你的答案标记为正确答案,因为你给出了这样一个好的和有用的答案,并且你建议我仔细研究提出第二个请求的代码,这导致了解决方案。谢谢! – timblack1