·vincent

Service Worker

Service Worker

浏览器

什么是Service Worker

Service Worker 是运行在浏览器背后的独立线程,一般可以用来实现缓存功能。使用 Service Worker的话,传输协议必须为 HTTPS。因为 Service Worker 中涉及到请求拦截,所以必须使用 HTTPS 协议来保障安全。

实现缓存的步骤

Service Worker 实现缓存功能一般分为三个步骤:

  • 首先需要先注册 Service Worker
  • 然后监听到 install 事件以后就可以缓存需要的文件,那么在下次用户访问的时候就可以通过拦截请求的方式查询是否存在缓存
  • 存在缓存的话就可以直接读取缓存文件,否则就去请求数据。

以下是这个步骤的实现:

js
1// index.js
2if (navigator.serviceWorker) {
3  navigator.serviceWorker
4    .register('sw.js')
5    .then(function(registration) {
6      console.log('service worker 注册成功')
7    })
8    .catch(function(err) {
9      console.log('servcie worker 注册失败')
10    })
11}
12// sw.js
13// 监听 `install` 事件,回调中缓存所需文件
14self.addEventListener('install', e => {
15  e.waitUntil(
16    caches.open('my-cache').then(function(cache) {
17      return cache.addAll(['./index.html', './index.js'])
18    })
19  )
20})
21
22// 拦截所有请求事件
23// 如果缓存中已经有请求的数据就直接用缓存,否则去请求数据
24self.addEventListener('fetch', e => {
25  e.respondWith(
26    caches.match(e.request).then(function(response) {
27      if (response) {
28        return response
29      }
30      console.log('fetch source')
31    })
32  )
33})

打开页面,可以在开发者工具中的 Application 看到 Service Worker 已经启动了 在 Cache 中也可以发现我们所需的文件已被缓存

当我们重新刷新页面可以发现我们缓存的数据是从 Service Worker 中读取的