如何使用服务工作者获取json数据并更新app shell

时间:2017-02-08 09:22:03

标签: javascript service-worker

我通过服务工作者注册,激活和缓存资源,现在我想知道如何使用服务工作者获取JSON数据并更新app shell。

我通过服务工作者注册,激活和缓存资源,现在我想知道如何使用服务工作者获取JSON数据并更新app shell。

var CACHE_NAME = 'my-cache-v1'; 
var urlsToCache = [
 
  '/common.css',
  '/common.js'
  
];

self.addEventListener('install', function (e) {
    console.log('[Service Worker] Install');
    e.waitUntil(
      caches.open(CACHE_NAME).then(function (cache) {
          console.log('[Service Worker] Caching app shell');
          return cache.addAll(urlsToCache);
      }).then(function(e){
        return self.skipWaiting();
      })
    );
});
self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        // Cache hit - return response
        if (response) {
          return response;
        }
      
        var fetchRequest = event.request.clone();

        return fetch(fetchRequest).then(
          function(response) {
            // Check if we received a valid response
            if(!response || response.status !== 200 || response.type !== 'basic') {
              return response;
            }

             var responseToCache = response.clone();

            caches.open(CACHE_NAME)
              .then(function(cache) {
                cache.put(event.request, responseToCache);
              });

            return response;
          }
        );
      })
    );
});

self.addEventListener('activate', function(e) {
  console.log('[ServiceWorker] Activate');
  e.waitUntil(
    caches.keys().then(function(keyList) {
      return Promise.all(keyList.map(function(key) {
        if (key !== CACHE_NAME) {
          console.log('[ServiceWorker] Removing old cache', key);
          return caches.delete(key);
        }
      }));
    })
  );
  return self.clients.claim();
});

1 个答案:

答案 0 :(得分:1)

模仿的一个例子是https://github.com/GoogleChrome/sw-precache/tree/master/app-shell-demo

它在构建过程中集成了sw-precache,以使App Shell资源(HTML,JS,CSS)保持最新。

它使用运行时缓存(通过对sw-toolbox的依赖)来缓存JSON API响应以及图像。

它基于React / react-router / react-redux的略微过时的版本,但一般原则仍应适用。