2016-01-18 30 views
13

我請教了很多資源,對服務人員:如何在ServiceWorker更新後刷新頁面?

但是,我不能爲我的生活弄清楚如何在新的ServiceWorker安裝後更新頁面。不管我做什麼,我的頁面都卡在舊版本中,只有硬刷新(Cmd-Shift-R)才能修復它。 1)關閉標籤,2)關閉Chrome,或3)location.reload(true)將無法​​組合新內容。

我有一個super simple example app主要基於SVGOMG。在安裝時,我緩存了一堆使用cache.addAll()資源,我也做skipWaiting()如果當前版本的主版本號不匹配該活動的版本號碼(基於IndexedDB的查找):

self.addEventListener('install', function install(event) { 
    event.waitUntil((async() => { 
    var activeVersionPromise = localForage.getItem('active-version'); 
    var cache = await caches.open('cache-' + version); 
    await cache.addAll(staticContent); 
    var activeVersion = await activeVersionPromise; 
    if (!activeVersion || 
     semver.parse(activeVersion).major === semver.parse(version).major) { 
     if (self.skipWaiting) { // wrapping in an if while Chrome 40 is still around 
     self.skipWaiting(); 
     } 
    } 
    })()); 
}); 

我使用一個啓發式的系統,其中主要版本號表示新的ServiceWorker不能爲舊的ServiceWorker進行熱插拔。這適用於ServiceWorker端 - 從v1.0.0到v1.0.1的顛簸導致工作人員立即安裝在刷新上,而從v1.0.0到v2.0.0等待該標籤在被關閉並重新打開之前被重新打開安裝。

回到主線程,我手動更新註冊後的ServiceWorker –,否則該頁面甚至從來沒有得到有新版本的ServiceWorker可用的備忘錄(奇怪的是,我發現在ServiceWorker中的任何地方很少提到這一點文獻):

navigator.serviceWorker.register('/sw-bundle.js', { 
    scope: './' 
}).then(registration => { 
    if (typeof registration.update == 'function') { 
    registration.update(); 
    } 
}); 

然而,被提供給主線程的內容始終停留在舊版本的頁面(「我的版本是1.0.0」),無論我是否遞增版本爲1.0.1或2.0.0。

我有點難倒在這裏。我希望找到ServiceWorker版本控制的優秀semver-y解決方案(因此我使用了require('./package.json').version),但是在我目前的實現中,用戶永遠停留在舊版本的頁面上,除非他們硬刷新或手動清除他們所有的數據。 :/

+0

我無法找到您已經完成的步驟以確保安裝了新的服務人員。您聲稱但尚未確保它確實已安裝。 –

回答

16

找到你需要避免任何問題– ServiceWorker JS文件本身的緩存標頭。設置高速緩存max-age=0立即解決了這個問題:https://github.com/nolanlawson/serviceworker-update-demo/pull/1

乾杯傑克阿奇博爾德設置我直:https://twitter.com/jaffathecake/status/689214019308224513

+0

確實會改變max-age = 0有什麼負面影響? – jasan

+0

謝謝你,我一直有同樣的問題。我正在使用http-server npm軟件包,並在閱讀此文件後瞭解到,默認情況下它將max-age = 2600。使用'-c-1'啓動服務器會禁用服務器,這樣您的服務工作者的行爲就會更加可預測。例如。 'http-server -c-1 -p 8081' –

1

在Chrome Canary版你可以做所有類型的服務工作人員分析和管理像註銷的,在應用程序明確標籤:

enter image description here

一對鍍鉻://設備/與你的物理設備進行調試。