【发布时间】:2019-12-13 19:45:25
【问题描述】:
因此,在我当前的系统中,每当我制作一个 javascript 包时,我都会在文件名中添加一个哈希以用于生产构建。我的 index.html 中没有 CDN 缓存,因此每当一个新版本出现时,都会创建一个新的 index.html,指向新的散列 javascript 文件名。每当发生新部署时,这可以很好地使捆绑包的缓存失效(代价是我的非常小的 index.html 没有被缓存)
我正在考虑让我的应用程序作为 PWA 工作,并且想知道在部署新的应用程序版本时如何使现有用户的缓存无效。以下是问题:
serviceworker.js 需要有一个固定的文件名(文件名中没有哈希),这意味着我的 CDN 会长时间缓存该文件,我不想在每次部署时手动使 CDN 缓存失效.我想我可以像对 index.html 一样删除 serviceworker.js 上的缓存,因为该文件只下载一次。
我的工作人员在用户的浏览器中注册,我不确定是否需要添加一些额外的代码来检查工作人员的新版本是否可用。浏览器如何决定何时尝试更新已注册的 serviceworker?我可以取消注册我的 Service Worker 以在我的 PWA 中安装新版本吗?这不会破坏 PWA 吗?
我的 index.html 由 service worker 缓存,这意味着使用 PWA 的人永远不会获得我的主要 JS 包的新版本(因为缓存的 index.html 将通过哈希指向旧的包文件名)。我想我可以删除 index.html 上的 serviceworker 缓存,但应用程序将无法离线运行?
如果想离线使用我的应用程序,我需要我的 service worker 能够缓存我的散列 JS 文件。我想我需要对 self.addEventListener('fetch', ...) 中的文件名做一些魔术,以使用缓存版本(如果可用),并在互联网可用时定期检查新版本,获取散列的 JS 包文件名创建未缓存的静态 JSON 文件或具有最新文件名的文件。不过,这似乎是一个骇人听闻的解决方案。
我似乎找不到关于如何处理这些问题的好指南,感觉就像浏览器应该能够根据某些选项(例如每 X 次重试一次)为我做的事情需要做很多工作。是否有一些我不知道的神奇 HTTP 标头?
【问题讨论】:
标签: javascript service-worker progressive-web-apps cdn