• 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    改变选则时请求数据并显式在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);
      });
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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;
              });
            })
          );
        })
      );
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

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

  • 相关阅读:
    ChatGPT作者John Schulman:我们成功的秘密武器
    Ubuntu22.04深度学习GPU环境配置:Nvidia CUDA 11.7、cuDNN 8.5 详细解读(20220910)
    RabbitMQ - Spring boot 整合 RabbitMQ
    到底是选择极米还是选择当贝?画质看当贝,音质看极米 在意画质和使用体验的选当贝
    记CVE-2022-39227-Python-JWT漏洞
    linux系统zabbix监控配置钉钉告警
    powershell美化
    【第十篇】- Maven 引入外部依赖
    分布式链路追踪-skywalking基础
    简化后端:一篇带你走进云开发及小程序云开发的世界
  • 原文地址:https://blog.csdn.net/xiapi3/article/details/126362828