PWA - Service worker生命周期

815 阅读2分钟

简介

Service worker是pwa实现的关键,理解service worker,它有什么特征,是如何工作的?

特征

  • 运行在自己的全局脚本上下文中
  • 不绑定到具体的页面
  • 无法修改页面中的元素,因为它无法访问dom
  • 只能使用https

如何工作的

Worker的生命周期

  • 注册
  • 下载,解析和执行
  • 安装
  • 激活

注册

调用register函数, service worker开始下载

下载,解析和执行

在注册过程中, 浏览器会开始下载, 解析并执行service worker,如果在此步骤出现任何的错误,resigter返回的promise都会执行reject操作,并且service worker会被废弃.

安装

一旦service worker成功执行,安装事件就会激活, service worker是基于事件的,意味着我们可以利用这些事件来实现超快速缓存技术。

激活

一旦安装完成,worker就被激活,并控制其范围内的一切,如果生命周期中的所有事件都成功了,worker便准备就绪,随时可以使用。

实例代码

index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    img{
      width: 300px;
    }
  </style>
</head>
<body>
  <img src="/images/xxx.jpg" alt="">
  <script>
    // 注册service worker.
    registerWorker();

    function registerWorker(){
      // 判断是否支持serviceWorker.
      if('serviceWorker' in navigator){
        navigator.serviceWorker.register('/sw.js').then(
          registration => {
            // 注册成功
            console.log('注册成功,', registration.scope);
          }
        ).catch(err => {
          // 注册失败
          console.log(err);
        })
      }
    }
  </script>
</body>
</html>

sw.js文件

// 为fetch事件添加监听器
self.addEventListener('fetch', event => {
  // 拦截.jpg结尾的文件, 获取demo.jpg作为代替图片来响应请求.
  if(/\.jpg$/.test(event.request.url)){
    event.respondWith(fetch('/images/demo.jpg'));
  }
});

github

code

备注

当第一次加载页面时,service worker还没有激活,所以它不会处理任何的请求,只有当它安装和激活后,才能控制其范围内的一切,这意味着,只有刷新页面或导航到另一个页面。service worker内的逻辑才会启动。如果要让它立即工作, 我们也有一定的办法, 后面会介绍对于的解决方案.

最近会持续更新pwa相关的文章, 敬请关注.