【发布时间】:2017-11-09 02:19:50
【问题描述】:
我见过的所有使用 Service Worker 的离线 Web 应用程序示例都包括以下模式以在安装时预获取其资产:
self.addEventListener('install', function(event) {
event.waitUntil(caches.open('assets').then(function(cache) {
return cache.addAll([
'/',
'/static/all.css',
'/static/script.js',
...
])
}));
});
但是,我在使用这种方法时遇到了以下问题:
- 首次加载时,资源会被提取两次,一次是在初始页面加载期间(在 Service Worker 处于活动状态之前),另一次是安装 Service Worker。
- 安装期间预取的响应是否可能会自动从缓存中删除(当网站有一段时间未访问或存储空间不足时)?
- 编译和维护完整的资产列表很麻烦。有时甚至是不可能的,例如使用 Google 字体时,只知道 CSS 的位置,但字体本身的位置会因浏览器而异,并且可能会发生变化。
或者,我可以在第一次请求资产时缓存它们,这将消除上述问题。但是这样显然不能保证在用户离线时缓存已经被填充。通过Link 标头注册 Service Worker 可能会缓解这种情况,使其在请求资产时可能运行。当然,这仅适用于单页应用程序,在每个页面视图上都请求所有资源。
或者有没有更好的做法?
【问题讨论】: