那些听不见音乐的人,会认为那些跳舞的人疯了。

  • service worker是一段脚本,与web worker一样,也是在后台运行。作为一个独立的线程,运行环境与普通脚本不同,所以不能直接参与web交互行为。即无法操作DOM,同样也无法访问Local Storage API和XHR API等。
  • Service Worker能够与下面几个API合作:Promises、Fetch API、Cache API。只有在HTTPS协议下的网页里它们才会起作用。(不过不包括本地的网络请求,因为它们不需要保持安全连接。这样也方便我们调试)
  • 先来看一个service worker的运行周期:

  • 1、注册,注册阶段是通知浏览器service worker的存在,并且在后台开始安装(浏览器始终只会在service worker之前没有注册过或是需要更新的情况下进入注册阶段) 2、安装,如果浏览器发现一个service worker过期或之前没有注册过,那么它将安装这个service worker。这是使用service worker初始化缓存,然后利用Cache API来缓存APP shell和静态资源的好时机 3、激活,激活成功之后,打开chrome://inspect/#service-workers可以查看到当前运行的service worker 4、销毁,是否销毁由浏览器决定,如果一个service worker长期不使用或者机器内存有限,则可能会销毁这个worker
  • fetch事件:在页面发起http请求时,service worker可以通过fetch事件拦截请求,并且给出自己的响应。w3c提供了一个新的fetch api,用于取代XMLHttpRequest,与XMLHttpRequest最大不同有两点:1、fetch()方法返回的是Promise对象,通过then方法进行连续调用,减少嵌套 2、提供了Request、Response对象
  • message事件:页面和serviceWorker之间可以通过posetMessage()方法发送消息,发送的消息可以通过message事件接收到。这是一个双向的过程。
  • service worker的更新很简单,只要service-worker.js的文件内容有更新,就会使用新的脚本。但是有一点要注意:旧缓存文件的清除、新文件的缓存要在activate事件中进行,因为可能旧的页面还在使用之前的缓存文件,清除之后会失去作用。
  • 更新后的service worker只有在所有页面都被关闭后才开始代替之前的service worker工作。如果仅仅是刷新页面是不会起作用的,因为之前的service worker仍然在运行且没有被删除。这种机制保证了更新不会让之前在运行的app或网页崩溃。
  • 事实上,推送和消息通知是两个不同的概念,它们组合而成的技术才是我们熟悉的消息推送。推送机制使得服务器能够向service worker发送信息,然后service worker将信息展示给用户才是消息通知。
  • 由于service worker可以在app关闭后继续运行,所以它们能够一直监听推送事件。然后它们可以发送消息通知,或者是更新app的状态。
  • waitUntil()方法接收一个promise对象,直到这个promise对象成功resolve之后,才会继续运行service-worker.js。

Comments

去留言
2018-04-11

⬆︎TOP