Service Worker 学习记录
能干什么?
- 后台消息传递
- 网络代理,转发请求,伪造响应
- 离线缓存
- 消息推送
对于并发高的活动页面,缓存图片文件和js文件,达到减轻服务器负担的作用。
怎么用?
页面中注册 Service Worker
1 2 3 4 5 6 7
| if (navigator.serviceWorker) { navigator.serviceWorker.register('service-worker.js').then(function(registration) { console.log('service worker 注册成功'); }).catch(function (err) { console.log('servcie worker 注册失败') }); }
|
缓存文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var cacheFiles = [ '5BB072CAB1104C1F2E254F7F0EC0EB70.jpg', 'main.js' ] var VERSION = 'v1';
self.addEventListener('install', function(event) { event.waitUntil( caches.open(VERSION).then(function(cache) { return cache.addAll(cacheFiles); }) ); });
|
更新版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| self.addEventListener('activate', function(event) { event.waitUntil( caches.keys().then(function(cacheNames) { return Promise.all( cacheNames.map(function(cacheName) { if (cacheName !== VERSION) { return caches.delete(cacheName); } }) ); }) ); });
|
缓存文件请求拦截
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| self.addEventListener('fetch', function (evt) { evt.respondWith( caches.match(evt.request).then(function(response) { if (response) { return response; } var request = evt.request.clone(); return fetch(request).then(function (response) { if (!response && response.status !== 200 && !response.headers.get('Content-type').match(/image/)) { return response; } var responseClone = response.clone(); caches.open('my-test-cache-v1').then(function (cache) { cache.put(evt.request, responseClone); }); return response; }); }) ) });
|
注意事项
- 需要
https
才可以使用,但是 localhost 或 127.0.0.1
除外。
- 生命周期为: installing、installed、activating、activated
- 浏览器支持情况桌面端Chrome和Firefox可用,IE不可用。移动端Chrome可用
- 在微信上的支持情况,iOS设备不支持,安卓支持
- 只需要更新
service-worker
的注册文件,更换版本,即可更新资源
参考地址: