【PWA】用Service Worker实现离线应用

没有离线缓存的应用,没有网络时就毛都访问不了。但是当我们利用service worker设置了离线缓存,那我们的应用就算没网也能访问,是不是很神奇,下面是其简单的用法。
想了解service worker相关知识,可以看我另一篇文章service worker相关知识

1.注册service worker
调用navigator.serviceWorker.register方法即可在应用中注册需要用到的serviceWorker文件。
注意:要在页面加载完成后再进行注册,以防影响有网络情况下页面的加载速度!

// 注册 service worker
//要在async函数中使用,没有的话,去掉await关键词
if ("serviceWorker" in navigator) {
   try {
     const registration = await navigator.serviceWorker.register(
       "../src/assets/sw.js"
     );
     console.log("注册成功");
   } catch (error) {
     console.log("注册失败", error);
   }
 }
  1. 配置sw.js
//sw.js 内容
//设置缓存名字 用于版本比较删除之前的cache
const CACHE_NAME = "cache_name_v1";
this.addEventListener("install", async (event) => {
  // 开启一个cache 得到一个cache对象
  const cache = await caches.open(CACHE_NAME);
  // 等待cache把所有的资源存储
  await cache.addAll([
    "/index.html",
    "/manifest.json",
    "/img/icon.png",
    "/css/index.css",
    "/js/index.js",
  ]);
  // 等待skipWaiting结束才进入到activate
  await this.skipWaiting();
});

//sw.js 内容
// 主要清除旧的缓存
this.addEventListener("activate", async (event) => {
    const keys = await caches.keys();
    // 判断key 删除旧的资源
    keys.forEach((key) => {
      if (key !== CACHE_NAME) {
        caches.delete(key);
      }
    });
    // 表示service worker激活后,立即活的控制权
    await this.clients.claim();
  });

  //sw.js 内容
this.addEventListener("fetch", (event) => {
    const req = event.request;
    event.respondWith(networkFirst(req));
  });
  // 网络优先
  async function networkFirst(req) {
    try {
      // 优先网络读取最新的资源
      const fresh = await fetch(req);
      return fresh;
    } catch (e) {
      // 去缓存中读取
      const cache = await caches.open(CACHE_NAME);
      const cached = await cache.match(req);
      return cached;
    }
  }
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端阿彬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值