在我的当前系统中,每当我制作JavaScript包时,我都会为生产版本添加一个哈希值到文件名中。我的index.html没有CDN缓存,因此每当有新版本发布时,就会创建一个新的index.html指向新的哈希JavaScript文件名。这在使捆绑内容失效方面效果很好,每当部署新版本时(代价是我的非常小的index.html不被缓存)。
我正在研究如何使我的应用程序成为PWA,并想知道如何在部署新版本时使现有用户的缓存失效。以下是问题:
1. serviceworker.js需要具有固定的文件名(文件名中没有哈希值),这意味着我的CDN将长时间缓存该文件,而我不想在每次部署时手动使CDN缓存失效。我猜我可以像对待index.html一样删除serviceworker.js的缓存,因为那个文件只会下载一次。
2. 我的worker在用户的浏览器中注册,我不确定是否需要添加一些额外的代码来检查是否有新版本的worker可用。浏览器如何决定何时尝试更新已注册的serviceworker?我可以取消注册我的service worker以安装PWA的新版本吗?那不会破坏PWA吗?
3. 我的index.html由服务工作线程缓存,这意味着使用PWA的人永远不会获得我的主JS包的新版本(因为缓存的index.html将指向旧的哈希文件名中的旧包)。我猜我可以只删除serviceworker缓存上的index.html,但那样应用程序就无法离线工作了?
4. 如果想要在离线情况下使用我的应用程序,我需要让我的服务工作线程能够缓存我的哈希JS文件。我猜我需要对self.addEventListener('fetch', ...)中的文件名进行一些魔法操作,以便在可用时使用缓存版本,并定期检查新版本,通过创建一个未缓存的静态JSON文件或具有最新文件名的其他内容来获取哈希JS包文件名。虽然这似乎是一个hackish的解决方案。
我似乎找不到如何处理这些问题的好指南,感觉这需要很多工作,而浏览器应该能够根据某些选项(例如每X个时间重试)自动完成这些工作。是否有一些神奇的HTTP标头我不知道?
我正在研究如何使我的应用程序成为PWA,并想知道如何在部署新版本时使现有用户的缓存失效。以下是问题:
1. serviceworker.js需要具有固定的文件名(文件名中没有哈希值),这意味着我的CDN将长时间缓存该文件,而我不想在每次部署时手动使CDN缓存失效。我猜我可以像对待index.html一样删除serviceworker.js的缓存,因为那个文件只会下载一次。
2. 我的worker在用户的浏览器中注册,我不确定是否需要添加一些额外的代码来检查是否有新版本的worker可用。浏览器如何决定何时尝试更新已注册的serviceworker?我可以取消注册我的service worker以安装PWA的新版本吗?那不会破坏PWA吗?
3. 我的index.html由服务工作线程缓存,这意味着使用PWA的人永远不会获得我的主JS包的新版本(因为缓存的index.html将指向旧的哈希文件名中的旧包)。我猜我可以只删除serviceworker缓存上的index.html,但那样应用程序就无法离线工作了?
4. 如果想要在离线情况下使用我的应用程序,我需要让我的服务工作线程能够缓存我的哈希JS文件。我猜我需要对self.addEventListener('fetch', ...)中的文件名进行一些魔法操作,以便在可用时使用缓存版本,并定期检查新版本,通过创建一个未缓存的静态JSON文件或具有最新文件名的其他内容来获取哈希JS包文件名。虽然这似乎是一个hackish的解决方案。
我似乎找不到如何处理这些问题的好指南,感觉这需要很多工作,而浏览器应该能够根据某些选项(例如每X个时间重试)自动完成这些工作。是否有一些神奇的HTTP标头我不知道?
window.location.reload(true)
来清除它。我不确定服务工作者缓存。 - Ali SabziNezhadreload(true)
有效吗?它是否绕过了服务工作器缓存? - Farhad