·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
中读取的