如何告诉Service Worker要缓存哪些文件

时间:2015-08-05 03:20:26

标签: google-chrome caching browser-cache service-worker

我正在做什么

我正在构建一个Service Worker组件。我希望它有:

  • 包含Service Worker实现的单个worker.js文件。
  • 我希望能够告诉worker要缓存哪些文件,以及缓存的名称。
    • 为什么?我想在几个项目中要求使用此模块,我不希望其中任何一个项目修改工作文件。工作者应该能够接收要缓存的路径列表。

我尝试了什么

  • 我尝试将配置对象传递给register方法,但它不起作用。工人没有收到物品。
  • 利用工作人员可用的postMessage API,我这样做了:
    1. 在工作人员的注册中,我向工作人员发送了一条消息,其中包含一个带有缓存路径的对象。
    2. 在工作人员内部,我已将工作者订阅此消息,并使用这些路径创建缓存。
  

亲自看看

在主线程中注册工作人员

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/worker.js').then(function(reg) {
        navigator.serviceWorker.controller.postMessage({
            'hello': 'world',
            cacheName: 'v1',
            urlsToCache: [
                "/index.html"
            ]
        });
    }, function(err) {
        console.log('ಠ_ಠ   Nope.', err);
    });
}

工作人员文件

'use strict';

var cacheName,
    urlsToCache;

importScripts('/node_modules/serviceworker-cache-polyfill/index.js');

self.addEventListener('message', function (evt) {
    cacheName = evt.data.cacheName;
    urlsToCache = evt.data.urlsToCache;
});

self.addEventListener('install', function(event) {
    setTimeout(function(){
        event.waitUntil(
            caches.open(cacheName)
            .then(function(cache) {
                console.log('Opened cache:', cache);
                return cache.addAll(urlsToCache);
            })
        );
    }, 2000);

});

这有什么问题?

我不得不通过使用setTimeout来延迟缓存的打开,这是错误的,丑陋的和不可靠的。

你想要实现什么,伙计? ಠ_ಠ

我想找到一种方法告诉工作人员等到包含缓存路径的邮件到达。

  

链接到我的repo

提前致谢。

1 个答案:

答案 0 :(得分:1)

我已向您发送了拉取请求:https://github.com/cristianelias/serviceworker_component/pull/1。基本上我所做的是使用页面本身的缓存对象,如下所示:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/worker.js').then(function(reg) {
      caches.open('pages').then(function(pages){
         return pages.add('test.html'); 
      }).then(function(){
         console.log('cached!'); 
      });
    }, function(err) {
      console.log('ಠ_ಠ   Nope.', err);
  });
}

并指示SW仅执行缓存匹配:

'use strict';

self.addEventListener('fetch', function(event) {
    event.respondWith(
        caches.match(event.request).then(function(match){
            return match || fetch(event.request); 
        })
    );
});

它在Chrome 45上按预期工作,我不知道旧版本,因为将缓存对象移动到页面是一件很新鲜的事。