【发布时间】:2022-12-12 18:05:58
【问题描述】:
此代码位于 index.html 中。我用我的最新版本的 Blazor WebAssembly PWA 应用程序调用 updateVersion。第一行是 Service Worker 的原始注册,它是 Blazor 应用程序模板的一部分。剩下的都是我加的。
navigator.serviceWorker.register('service-worker.js');
function updateVersion(newVersion) {
var key = 'x-photish-version';
var oldVersion = localStorage.getItem(key);
if (oldVersion == null) {
localStorage.setItem(key, newVersion);
}
else if (newVersion != oldVersion) {
localStorage.setItem(key, newVersion);
// Reload service worker
navigator.serviceWorker.register('service-worker.js').then(function (registration) {
caches.delete("blazor-resources-/").then(function (e) {
console.log("'blazor-resources-/' cache deleted");
});
registration.update();
window.location.reload();
}).catch(function (error) {
// registration failed
console.log(`Registration failed with ${error}`);
});
}
}
版本部分有效。它检测到该版本是新版本,并正确输入代码的 newVersion != oldVersion 部分,我想在其中确保应用程序已完全刷新。
为了测试它,我发布了我的应用程序的新版本,对我的应用程序进行了一些微不足道的更改,它检测到它是一个新版本并重新加载页面。而且我的小应用程序更改没有出现。它显示了旧版本的应用程序。
我必须从代码中找到一种方法来执行此操作,因为我不希望用户在每次加载页面时都检索到最新内容。仅当我实际部署了新版本的代码时。
我该怎么做才能确保刷新 serviceworker 并且不缓存 blazor 应用程序本身的缓存?
更新: 我认为将代码更改为以下内容后问题已解决,但我仍然看到某些情况下它不起作用。
navigator.serviceWorker.register('service-worker.js');
function updateVersion(newVersion) {
var key = 'x-photish-version';
var oldVersion = localStorage.getItem(key);
if (oldVersion == null) {
localStorage.setItem(key, newVersion);
}
else if (newVersion != oldVersion) {
localStorage.setItem(key, newVersion);
caches.delete("blazor-resources-/").then(function (e) {
console.log("'blazor-resources-/' cache deleted");
});
// Reload service worker
navigator.serviceWorker.register('/service-worker.js', { updateViaCache: 'none' }).then(function (registration) {
window.location.reload();
}).catch(function (error) {
// registration failed
console.log(`Registration failed with ${error}`);
});
}
}
仍然希望有人可以修复代码并使其无懈可击,或者干脆声明由于某种原因这在技术上是不可能的。
【问题讨论】:
-
我尝试在下面给出一个很好的解决方案,请检查一次
标签: blazor progressive-web-apps service-worker blazor-webassembly