運行在瀏覽器端的代理服務器
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,該文件需配置以下屬性: