运行在浏览器端的代理服务器
if ('serviceWorker' in navigator) { window.addEventListener('load', function () { navigator.serviceWorker.register('/sw.js', { scope: '/' }).then(function (reg) { // 注册成功 console.log('success and scope: ', reg.scope); }).catch(function (err) { // 注册失败 console.log('failed: ', err); }); }); }
缓存文件
此状态下,worker有效但还没有激活,它还没有归入 document的控制,确切来讲是在等待着从当前 worker 接手html
sw.js发生了更新,可是页面一直挂载中,没有关闭或强制刷新,此时上一个版本的sw还在工做中,新的sw处于等待中git
// 安装阶段跳过等待,直接进入 active self.addEventListener('install', function (event) { event.waitUntil(self.skipWaiting()); }); self.addEventListener('activate', function (event) { event.waitUntil( Promise.all([ // 更新客户端 self.clients.claim() ]) ); });
缓存更新
代理请求
sw与主线程间的双向通讯,创建MessageChannel
做为纽带github
// index.html navigator.serviceWorker.register('/service-worker.js', { scope: '/' }).then(function (reg) { // 建立一个 const channel = new MessageChannel(); // port1供主线程使用 channel.port1.onmessage = messageEvent => { console.log('来自sw的message', messageEvent.data); } const serviceWorker = reg.active; // port2指向sw if (serviceWorker) { serviceWorker.postMessage('index->sw', [channel.port2]); } }); // sw.js self.addEventListener('message', function (event) { console.log('来自index的message', event.data); // 经过port找到发送消息的client event.ports[0].postMessage('sw->index'); });
建立一个cachejson
没法直接缓存跨域的请求,response.status会返回0segmentfault
catch.match(request, { }).then(function(response) { })
分段缓存,提升安装成功率后端
渐进式缓存跨域
优先原则数组
一个基本的manifest.json浏览器
{ "short_name": "短名称", "name": "这是一个完整名称", "icon": [ { "src": "icon.png", "type": "image/png", "sizes": "48x48" } ], "start_url": "index.html" }
能够实现的功能缓存
基本功能
添加启动画面
应用安装横幅
站点部署 manifest.json,该文件需配置以下属性: