2015-06-25 67 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