【发布时间】:2019-03-06 16:09:55
【问题描述】:
我仍然在纠结如何避免 Progressive Web Apps 中的缓存问题。任何 PWA 缓存的关键是能够更新 ServiceWorker 文件(我们称之为 sw.js)。但是细节让我有点困惑:
可以在每次页面加载时执行
navigator.serviceWorker.register('sw.js'),因为register()会更新应用程序缓存,或者如果所有内容都是最新的,则什么也不做——对吗?使用
navigator.serviceWorker.register('sw.js?' + Date.now())之类的方法来避免 HTTP 缓存是否有意义?或者,如果服务器使用 ETag,我是否安全?浏览器是否在每次页面加载时检查网络以获取更新的 sw.js?我有时在网络检查器选项卡中看不到它。
如果 sw.js 在应用缓存中,浏览器是否会从那里获取它而不检查服务器是否有更新?
-
我有时会看到像这样缓存自身的 ServiceWorker 演示脚本:
self.addEventListener('install', ev => { const myCaches = { app: {...}, sw: { files: [ '/sw.js' ], version: '1' } } for (let name in myCaches) { const cacheName = name + '-' + myCaches[name].version ev.waitUntil( caches.has(cacheName).then(uptodate => { if (uptodate) return true caches .open(cacheName) .then(cache => { cache.addAll(myCaches[name].files) }) }) ) // clear old caches } })
这有意义吗,这是一种好习惯吗?它是否使更新缓存更可靠?
【问题讨论】:
-
我不确定 ETags,但似乎浏览器将转向忽略服务工作者的 HTTP 缓存developers.google.com/web/updates/2018/06/fresher-sw
-
这很有趣,而且似乎是个好主意。不过我不会依赖它,因为它是一个相当新的功能,而且我在规范或其他浏览器的文档中都找不到类似的东西。
标签: javascript service-worker progressive-web-apps