一個服務器與瀏覽器之間的中間人角色,若是網站中註冊了service worker那麼它能夠攔截當前網站全部的請求,進行判斷(須要編寫相應的判斷程序),若是須要向服務器發起請求的就轉給服務器,若是能夠直接使用緩存的就直接返回緩存再也不轉給服務器。從而大大提升瀏覽體驗。javascript
/* 判斷當前瀏覽器是否支持serviceWorker */ if ('serviceWorker' in navigator) { /* 當頁面加載完成就建立一個serviceWorker */ window.addEventListener('load', function () { /* 建立並指定對應的執行內容 */ /* scope 參數是可選的,能夠用來指定你想讓 service worker 控制的內容的子目錄。 在這個例子裏,咱們指定了 '/',表示 根網域下的全部內容。這也是默認值。 */ navigator.serviceWorker.register('./serviceWorker.js', {scope: './'}) .then(function (registration) { console.log('ServiceWorker registration successful with scope: ', registration.scope); }) .catch(function (err) { console.log('ServiceWorker registration failed: ', err); }); }); }
serviceWorker.js
中書寫對應的安裝及攔截邏輯/* 監聽安裝事件,install 事件通常是被用來設置你的瀏覽器的離線緩存邏輯 */ this.addEventListener('install', function (event) { /* 經過這個方法能夠防止緩存未完成,就關閉serviceWorker */ event.waitUntil( /* 建立一個名叫V1的緩存版本 */ caches.open('v1').then(function (cache) { /* 指定要緩存的內容,地址爲相對於跟域名的訪問路徑 */ return cache.addAll([ './index.html' ]); }) ); }); /* 註冊fetch事件,攔截全站的請求 */ this.addEventListener('fetch', function(event) { event.respondWith( // magic goes here /* 在緩存中匹配對應請求資源直接返回 */ caches.match(event.request) ); });
以上爲一個最簡單的使用例子,更多內部api請查看 mdn service worker
Service worker運行在worker上下文 --> 不能訪問DOMhtml
它設計爲徹底異步,同步API(如XHR和localStorage)不能在service worker中使用java
出於安全考量,Service workers只能由HTTPS承載web
在Firefox瀏覽器的用戶隱私模式,Service Worker不可用小程序
其生命週期與頁面無關(關聯頁面未關閉時,它也能夠退出,沒有關聯頁面時,它也能夠啓動)api
兼容狀況瀏覽器
在MDN的兼容狀況中能夠看到Safari 對於Service workers的全線不支持,這是由於經過Service workers能夠在瀏覽器上實現一種相似小程序的功能(PWA)。這將繞過蘋果的app store致使蘋果不能再和開發者37開分紅,因此蘋果不喜歡這項技術。ps:不過仍是在18年開始支持了😂緩存