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

How to tell Service Worker which files to cache

我在做什么

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

我试过的

See it for yourself

在主线程注册worker

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 延迟打开缓存,这是错误的、丑陋的和不可靠的。

伙计,你想达到什么目的? ಠ_ಠ

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

Link to my repo

提前致谢。

我已经向您发送了一个合并请求: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 上按预期工作,我不知道旧版本,因为将缓存对象移动到页面是一件很新的事情。