我有以下服务人员:
var files2cache = {
"001.html": 1482843787,
..
"/": 1482821117,
};
self.addEventListener('install', function(e) {
e.waitUntil(
caches.open(cacheName).then(function(cache) {
return cache.addAll(Object.keys(files2cache));
})
);
});
// If request matches something in cache - return it from cache
// otherwise do actual request
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request).then(function(response) {
return response || fetch(event.request);
})
);
});
生成 files2cache
并包含对其中列出的文件所做的最后更改的时间戳。
问题是如何从以前版本的服务工作者获取此变量的值,所以我addAll
只能files2cache[fn] > oldFiles2cache[fn]
为真的文件?
答案 0 :(得分:3)
存在(至少)两个用于存储此版本控制信息的选项:
修改Cache Storage API中用作键的URL
这是sw-precache
uses的方法。在使用Cache Storage API存储条目之前,它会修改请求URL以附加格式为_sw-precache=<ID>
的新URL查询参数。在访问demo page后,您可以通过查看Chrome的缓存查看器来查看此操作:
由于您的fetch
处理程序需要针对不包含此附加查询参数的URL执行缓存匹配,因此您需要修改与之匹配的URL,以便在调用之前添加预期的版本控制信息caches.match()
。 sw-precache
通过maintaining a mapping原始网址处理带有版本信息的网址。
使用IndexedDB存储版本控制信息
由于您需要在IndexedDB和Cache Storage API中同步信息,因此这种方法需要更多的开销,但是通过将版本信息卸载到IndexedDB,您可以保持缓存的请求URL不被修改,这使得它成为可能。使用caches.match()
对#34; real&#34;更容易执行缓存查找网址。
在sw-precaching
回购邮件的新sw-helpers
项目中,example采用了这种方法。该项目仍在进行中,但它应该说明这些概念。
如果采用这种方法,使用支持promise的IndexedDB包装库(如https://www.npmjs.com/package/idb-keyval)可以真正简化操作。