缓存技术之Service Worker缓存-生命周期-安装

504 阅读3分钟

这是我参与8月更文挑战的第21天,活动详情查看: 8月更文挑战

Service Worker生命周期

生命周期回顾

Service Worker生命周期的各个环节如图所示:

未命名文件 (1).png

通常每一个Service Worker都会依赖于各自独立的执行脚本,在页面需要使用时通过请求相应的执行脚本进行Service Worker的注册;当注册流程启动后,便可在执行脚本中监听install事件来判断安装是否成功,若安装成功则可进行有关离线缓存的处理操作。

但此时的安装成功并不意味着Service Worker已经能够取得页面的控制权,只有进行激活后,Service Worker才能监听页面发出的fetch和push等事件;如果Service Worker的执行脚本发生修改需要进行更新,则更新的流程也会涉及完整的生命周期。上图为Service Worker生命周期所涉及的五个关键状态,之后会一次讨论每个状态中所包含的关键处理操作。

安装

在注册步骤调用navigator.serviceWorker.register函数的处理过程中,会自动下载参数所指定的Service Worker执行脚本,然后进行解析与执行。此时处于Service Worker生命周期中的安装状态,如果在这个过程中由于某些原因引发了错误,则异步处理的Promise会拒绝继续执行,生命周期走到redundant终态,并且可在Chrome开发者工具的Application选项卡中,查看出相应的报错信息。

如果一切顺利,则对Service Worker所请求的执行脚本下载、解析并执行成功,就会触发install事件进行Service Worker的后续处理。这个事件对每个Service Worker来说只会在安装时触发一次,即便执行脚本仅发生了几字节的修改更新,浏览器也会认为这是一个全新的Service Worker,并在其重新安装后触发独立的install事件。
需要注意的是,在该事件中Service Worker其实还并未获得页面的控制权,即还不能监听页面上所发出的请求事件,但此时却可以执行一些与页面没有直接操作关系的其他任务,比如缓存一些页面稍后会用到的资源内容,代码示例如下:

//定义缓存名称  
const cacheName='cache-v1';  
//监听Service Worker安装的install事件并进行缓存操作  
self.addEventListener('install',(event)=>(  
  //设置安装步骤的处理内容  
  event.waitUntil(  
    caches.open(cacheName)  
      .then((cache)=>cache.addAll([
        '/dist/index.js',  
        '/dist/css/index.css',
      ])))  
));  

上述代码中通过event.waitUntil()方法设置了Service Worker暗转个步骤的处理内容,即将两个文件添加缓存,如果指定的文件都下载并添加缓存成功,则表明Service Worker安装完成;否则只要有一个文件未完成下载或添加缓存失败,则整个安装步骤失败。因此在指定缓存所依赖的文件列表时,应确保其中所包含的文件都能获取成功,或在获取失败后提供相应的错误处理,来避免因个别文件的缓存失败而导致Service Worker的安装失败。

另外,在Service Worker的install事件中其实并未取得页面的控制权,这个限制的主要原因是为了确保整个过程中页面仅由同一个Service Worker控制,且每次仅运行唯一的一个版本。