serviceWorker cache(个人)

流程

1:在service worker 的‘install’生命周期函数中开启一片内存,并缓存
2:在service worker 的‘activate’生命周期函数中删除无用的缓存
3:在service worker 的‘fetch’生命周期函数中优先请求网络数据,网络断开则请求缓存数据

常用api

caches.open() 开辟一片内存 并命名 返回内存的“控制器”

const CACHE_NAME = "cache2";
// 开辟一片内存 并命名 返回内存的“控制器”
const cache = await caches.open(CACHE_NAME);

cache.add(url)
方法接受一个URL作为参数,请求参数指定的URL,并将返回的 response对象添加到给定的cache

await cache.add("/index.js")

cache.addAll()
方法接受一个URL数组,并将生成的response对象添加到给定的缓存中,request对象成为存储的response操作的key

await cache.addAll([
    "/", // 缓存index.html文件要用 “/” 代替, 因为index.html的url为“/”,而不是“index.html”
    "/work.js",
    "/image/2.png",
    "/image/1.png"
  ])

await caches.keys()(caches全局对象的方法)
返回当前所有的已开辟的内存名称数组 如 “[cache1,cache2]”

const keys = await caches.keys();

await cache.match(req)
根据req获取内存中的response

const response = await cache.match(req);

综合示例

const CACHE_NAME = "cache2";
// 代码加载完执行
self.addEventListener("install", async event => {
  // 打开一个Cache 对象
  const cache = await caches.open(CACHE_NAME);
  await cache.addAll([
    "/",
    "/work.js",
    "/image/2.png",
    "/image/1.png"
  ])
  // skipWaiting 停止当前的service work 运行最新的serviceworker
  // waitUntil skipWaiting返回的是promise 等primise执行完后 在进行下一个生命周期函数
  await self.skipWaiting();
})
// 代码执行前触发
self.addEventListener("activate", async event => {
  //删除无用缓存
  const keys = await caches.keys();
  keys.forEach(item => {
    if (item !== CACHE_NAME) {
      caches.delete(item);
    }
  })

  // 获取控制权
  await self.clients.claim();
})
// 有网络请求时触发
self.addEventListener("fetch", event => {
  let request = event.request;
  event.respondWith(netFirst(request));
})

// 网络数据优先  断网就从缓存中获取
async function netFirst(req) {
  try {
    const response = await fetch(req);
    return response
  } catch {
    const cache = await caches.open(CACHE_NAME);
    const response = await cache.match(req);
    return response;
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值