Service Workers本质上是一种能在浏览器后台运行的独立线程,它能够在网页关闭后持续运行。Service Workers能够拦截网络请求并根据网络是否可用来采取适当的动作,更新来自服务器的资源,从而实现拦截和加工网络请求、消息推送、静默更新、事件同步等一系列功能。它是PWA(Progressive Web Apps,渐进式网络应用)应用的核心技术之一。它能够缓存网站资源,实现离线访问,能拦截网络请求,优化网络性能,因此利用这些优势去优化。
参考网站:
https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API
这篇文章不在详细介绍Service Workers的前世今生,只利用它的缓存特性提升网站性能,这里我们只建立白名单,将需要缓存的内容都放入其中。
创建一个脚本:
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里面是需要缓存的文件(白名单形式),特别注意,跨域的资源是无法缓存的。