服务工作者更新仅更改缓存中的内容,或在服务工作者之间共享数据

时间:2017-01-17 19:09:11

标签: service-worker progressive-web-apps

我有以下服务人员:

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]为真的文件?

1 个答案:

答案 0 :(得分:3)

存在(至少)两个用于存储此版本控制信息的选项:

修改Cache Storage API中用作键的URL

这是sw-precache uses的方法。在使用Cache Storage API存储条目之前,它会修改请求URL以附加格式为_sw-precache=<ID>的新URL查询参数。在访问demo page后,您可以通过查看Chrome的缓存查看器来查看此操作:

sw-precache parameter

由于您的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)可以真正简化操作。