Service Worker 简单学习


Service Worker 是PWA核心,是一种

  • 事件驱动的具有生命周期的独立于浏览器的主线程
  • 可以根据所在的目录来拦截所有网络请求
  • 可以访问缓存和IndexDB
  • 支持推送和缓存文件版本管理

特点:无法操作DOM、只能使用HTTPS和localhost

1. 前提Scope 限定其拦截请求范围

Service Worker 会根据其所在目录进行请求拦截,所以对于有离线访问需求的文件目录,可以在其中建立sw.js
(目前只在根目录下测试缓存成功。。。)

2. 背景demo

页面:

  <select onChange="onChange(this.value)">
    <option value="">--请选择--</option>
    <option value="/">首页</option>
    <option value="/login">登录</option>
    <option value="/register">注册</option>
    <option value="/data">数据</option>
  </select>
  <div id="data"></div>
  <script>
  function onChange(e) {
    if (e === "") return;
    fetch(
      "http://localhost:9988" + e, {
      method: 'GET',
    }).then(res => {
      return res.text();
    }).then(res => {
      document.getElementById('data').innerHTML = res
    })
  }
</script>

改变选则时请求数据并显式在div中

利用sw的缓存功能,可以将一些资源进行缓存,以便下次请求时使用

3. 加入sw

html引入一个app.js,用于注册sw

// 注册sw
if("serviceWorker" in navigator){
  navigator.serviceWorker.register("./sw.js").then(res=>{
    console.log("rg success! scope="+res.scope);
  });
}

sw.js

let cacheName = "weather-pwa-v1";
let appShellFiles = [
  "./index.html",
  "./app.js",
  "./weather.png",
  "./img/bg.jpg",
];

self.addEventListener("install", function (e) {
  e.waitUntil(
    caches.open(cacheName).then(function (cache) {
      // waitUntil 确保安装前执行完里面的代码
      console.log("[Service Worker] 缓存所有文件");
      return cache.addAll(appShellFiles);
    })
  );
});

self.addEventListener("fetch", function (e) {
  console.log("request.url", e.request.url);
  e.respondWith(
    caches.match(e.request).then(function (r) {
      console.log("[Service Worker] Fetch:" + e.request.url);
      return (
        r ||
        fetch(e.request).then(function (response) {
          return caches.open(cacheName).then((cache) => {
            console.log("[Service Worker] 缓存新文件:" + e.request.url);
            cache.put(e.request, response.clone());
            return response;
          });
        })
      );
    })
  );
});

此处将目标资源都缓存了,然后后面的请求也全部缓存起来,最终项目可以离线运行~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值