我請教了很多資源,對服務人員:如何在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
),但是在我目前的實現中,用戶永遠停留在舊版本的頁面上,除非他們硬刷新或手動清除他們所有的數據。 :/
我無法找到您已經完成的步驟以確保安裝了新的服務人員。您聲稱但尚未確保它確實已安裝。 –