chaihongjun.me

serviceworkers简单配置

Service Workers本质上是一种能在浏览器后台运行的独立线程,它能够在网页关闭后持续运行。Service Workers能够拦截网络请求并根据网络是否可用来采取适当的动作,更新来自服务器的资源,从而实现拦截和加工网络请求、消息推送、静默更新、事件同步等一系列功能。它是PWA(Progressive Web Apps,渐进式网络应用)应用的核心技术之一。它能够缓存网站资源,实现离线访问,能拦截网络请求,优化网络性能,因此利用这些优势去优化。

参考网站:

https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API

这篇文章不在详细介绍Service Workers的前世今生,只利用它的缓存特性提升网站性能,这里我们只建立白名单,将需要缓存的内容都放入其中。

e5871dd9d89130c4d42696576a40a84d.gif

创建一个脚本:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/public/static/js/serviceworker.js').then(function(registration) {
      console.log('ServiceWorker registration successful with scope: ', registration.scope);
    }).catch(function(err) {
      console.log('ServiceWorker registration failed: ', err);
    });
  });
}

以上代码写入需要优化的页面,用于在页面范围内注册Service Workers,注意代码内serviceworker.js这个文件的路径,这个文件用于实际编写缓存规则等配置。

接着编写serviceworker.js:

//serviceworker.js
var CACHE_NAME = 'v1';   //缓存版本号,当配置有修改的时候要修改它,以便新的配置生效
var urlsToCache = [      //缓存白名单
  '/hello/',
  'style.css?v=2017.11.25',
  'demo.js',
  'iconfont.eot?v=3',
  'iconfont.svg?v=3',
  'iconfont.ttf?v=3',
  'iconfont.woff?v=3'
];
 
self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(function(cache) {
        console.log('Opened cache');
        return cache.addAll(urlsToCache);
      })
  );
});
 
self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        if (response) {
          return response;
        }
        return fetch(event.request);
      }
    )
  );
});
 
self.addEventListener('activate', function(event) {
  var cacheWhitelist = 'v';
  event.waitUntil(
    caches.keys().then(function(cacheNames) {
      return Promise.all(
        cacheNames.map(function(cacheName) {
          if (cacheName.indexOf(cacheWhitelist) != -1 && cacheName != CACHE_NAME) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

urlsToCache里面是需要缓存的文件(白名单形式),特别注意,跨域的资源是无法缓存的。

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»