我们有一个渐进式Web应用程序,该应用程序利用Service Worker,其中UX是主机与来宾之间的实时协作。我们会定期发布更新,并且当主机和来宾在Service Worker中缓存了不同版本的应用程序时,有时会出现问题。我们热衷于不必将每个请求都往返于服务器而获得的性能收益,但是想知道我们是否应该停止使用它来确保我们的主机及其来宾都运行相同/最新版本?下面的背景信息
我们公开了isUpdateAvailable
个承诺。
this.isUpdateAvailable = new Promise((resolve, reject) => {
if('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js').then(reg => {
reg.onupdatefound = () => {
const installingWorker = reg.installing;
installingWorker.onstatechange = () => {
if(installingWorker.state === 'installed') {
if(navigator.serviceWorker.controller) {
// update available
resolve(true);
} else {
// no update
resolve(false);
}
} else {
// no update
resolve(false);
}
};
};
}).catch(err => { reject(err); });
}
});
在ready
上,我们检查更新
this.isUpdateAvailable.then(isAvailable => {
if(isAvailable) {
this.update();
}
});
首先,update()
方法遵循Google收件箱方法,该方法显示持续的Toast消息,通知更新并包括一个单击更新的“更新”按钮。我们发现有很大比例的房东和客人没有费心单击它。因此,我们放弃了吐司,并在有可用更新时立即致电window.location.reload(true)
。这有所帮助,但是我们让一些主机/来宾陷入了Service Worker的困境,需要手动停止以获取最新版本。
此外,我们最近开始发布带有硬编码客户端版本号的更新,并在数据库中添加了最新版本以与它们进行区分,以试图强制进行更新注册。
我们需要保证我们的主人及其客人运行的是相同版本的PWA。自己比较版本似乎太过分了,直接从服务器加载感觉更简单。我们应该停止使用Service Worker吗?还是这很典型,性能提升太有价值了,并且我们自己通过发布版本来走上正轨吗?