PWA 中 SW 生命周期及缓存策略详解

前言

在现代 web 应用中,PWA(Progressive Web App)成为了越来越流行的选择。PWA 带来了可靠、快速、可免费安装到桌面以及离线工作等良好的用户体验。Service Worker(SW)作为 PWA 技术的核心,可以为扩展 PWA 带来如网络代理和缓存等能力。这篇文章会深入介绍 SW 的生命周期以及缓存策略,希望可以为你深入了解 PWA 技术提供帮助。

SW 的生命周期

Service Worker 的生命周期一般可以分为以下三个阶段:

安装阶段(install)

在这个阶段中,我们可以将需要缓存的 assets 预存储到浏览器缓存中,以便下次离线使用。这个阶段会在 SW 文件被注册时执行,一般可以通过监听 install 事件来进行处理:

-------------------------------- --------------- -
  ----------------
    -------------------------------------------- -
      ------ --------------
        ----
        --------------
        -------------------
        -------------------
        ------------------
      ---
    --
  --
---

上面的代码中,我们使用了 caches API 来创建了一个名为 my-cache 的缓存,并将需要缓存的文件添加到了这个缓存中。注意,在添加完资源之后我们使用了 waitUntil 方法来保证 SW 安装阶段不会结束,直到我们的资源都被正确地缓存起来。

激活阶段(activate)

在第一次安装 SW 以及新 SW 版本被注册/安装时,激活事件会触发。在这个阶段中,我们可以开始使用与新版本 SW 相关的资源,例如删除旧版本资源。

--------------------------------- --------------- -
  --- -------------- - -------------
  ----------------
    --------------------------------------- -
      ------ ------------
        ---------------------------------- -
          -- ---------------------------------- --- --- -
            ------ -------------------------
          -
        --
      --
    --
  --
---

在上述代码中,我们使用了 caches.keys() 方法来获取当前 scoped 到 SW 的所有缓存,并使用了 Promisemap 方法来异步删除所有未出现在 cacheWhitelist 列表中的缓存。这个列表中包含了所有 SW 需要用到的缓存名。

拦截阶段(fetch)

在这个阶段中,我们可以处理所有从文档中发出的 HTTPS 请求。这个阶段的处理可以通过监听 fetch 事件来完成。

------------------------------ --------------- -
  ------------------
    --------------------------------------------------- -
      -- ---------- -
        ------ ---------
      -
      ------ ---------------------
    --
  --
---

在上述代码中,我们首先使用了 caches.match() 来查找资源的缓存。如果缓存存在,则直接将其返回;否则,我们使用 fetch() 方法来请求该资源。

缓存策略

SW 的灵活性和强大能力使其成为了 PWA 架构的核心。通过缓存和从缓存中获取资源,我们可以大大提高 web 应用的性能和速度。让我们来看看 SW 最常见的缓存策略并为每个策略给出示例代码:

网络优先策略

这个策略中,我们通过尝试从网络中获取资源。如果获取成功,则直接返回该资源;否则,我们使用通过缓存返回有效资源。这个策略的实现示例代码如下:

------------------------------ --------------- -
  ------------------
    -------------------------------------------- -
      -- ---------------- --- ---- -
        ------ -------------------------
      -
      ------ ---------
    ------------------- -
      ------ ----------------------------
    --
  --
---

在上述代码中,我们通过返回 404 错误页面来展现了当网络不可用且请求的资源不在缓存中时,通过缓存返回的实现。

缓存优先策略

在这个策略中,我们首先尝试从缓存中获取资源。如果缓存不存在/已失效,则尝试从网络中获取资源。如果获取成功,我们将其添加到缓存中,并返回该成功获取到的资源。这个策略的实现示例代码如下:

------------------------------ --------------- -
  ------------------
    --------------------------------------------------- -
      -- ---------- -
        ------ ---------
      -
      ------ -------------------------------------------- -
        -------------------------------------------- -
          ------------------------ ------------------
        ---
        ------ ---------
      ---
    --
  --
---

在上述代码中,我们先尝试从缓存中获取资源。如果在缓存中找到了资源,将其直接返回。如果未找到资源,则尝试从网络中获取。当网络请求成功后,我们将其添加到缓存中,以便下次使用直接从缓存中获取。

网络优先但同时使用缓存策略

在这个策略中,我们首先尝试从网络中获取资源。如果获取成功,我们将其添加到缓存中并同时返回该资源。如果获取不成功,我们通过从缓存中获取资源来尝试解决该请求。这个策略的实现示例代码如下:

------------------------------ --------------- -
  ------------------
    -------------------------------------------- -
      -------------------------------------------- -
        ------------------------ ------------------
      ---
      ------ ---------
    ------------------- -
      ------ ----------------------------
    --
  --
---

在上述代码中,我们首先尝试从网络中获取资源。当获取成功时,我们将其添加到缓存中并同时返回该资源。如果失败,则从缓存中获取资源并返回该资源。

总结

SW 可以为 PWA 执行一些非常有用的任务,并提供了强大的缓存功能。我们希望这篇文章可以让你深入了解 Service Worker 生命周期和 PWA 的缓存策略,从而更好地了解如何开发一个快速、可靠且离线可用的 web 应用。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65acfcb7add4f0e0ff68f5e7


猜你喜欢

  • Koa 开发 API 全攻略

    什么是 Koa Koa 是一个基于 Node.js 平台的下一代 web 开发框架,由 Express 框架的原班人马打造。与 Express 相比,Koa 更加轻量级,易于扩展和中间件编写。

    9 个月前
  • 在 ES8 中使用 Promise.race() 方法处理异步任务竞争

    在前端开发中,经常需要处理多个异步任务的竞争,即同时发起多个异步请求,只要有一个请求返回结果就可以继续后续操作。在 ES8 中,可以使用 Promise.race() 方法来实现这个功能。

    9 个月前
  • 为 Node.js 应用集成 Redis 缓存

    随着 Web 应用的发展,前端应用对数据的存储和访问的要求也越来越高,常常需要在后端使用缓存来提高访问速度。Redis 是一种内存缓存数据库,具有高效、可靠、可扩展等优点。

    9 个月前
  • Kubernetes 中多个节点上容器运行的监控实践

    在 Kubernetes 集群中,多个节点上可能同时运行多个容器。为了保障集群的健康和稳定运行,需要对这些容器进行监控。本文将介绍在 Kubernetes 中实现多节点容器监控的过程。

    9 个月前
  • 学习 CSS Flexbox 布局,就是这么简单

    CSS Flexbox 布局是一种流式布局模型,它是用于在网页中创建复杂和灵活的布局的强大工具。Flexbox 布局可以让我们更轻松地创建响应式设计,而不需要过多的计算和编写 CSS 代码。

    9 个月前
  • ECMAScript 2020 的新特性:Number.EPSILON 与 Math.abs 的关系及用法

    ECMAScript 2020 的新特性:Number.EPSILON 与 Math.abs 的关系及用法 在 ECMAScript 2020 的新特性中,Number.EPSILON 是一个重要的改...

    9 个月前
  • 利用 ES10 中的 Object.getOwnPropertyDescriptors() 方法进行对象克隆和拷贝

    利用 ES10 中的 Object.getOwnPropertyDescriptors() 方法进行对象克隆和拷贝 前言: 近几年,JavaScript 以其轻量化、高效率,以及在 Web 应用、No...

    9 个月前
  • RxJS 中使用 distinct 操作符剔除重复数据的技巧和实现方式

    1. 操作符 distinct 的介绍 RxJS 提供了许多操作符来处理数据流,其中一个非常有用的操作符是 distinct,它可以从数据流中剔除重复的数据,并只发出那些前面没有发出过的数据。

    9 个月前
  • 使用 ES9 中 Array.prototype.sort() 的稳定排序技巧

    使用 ES9 中 Array.prototype.sort() 的稳定排序技巧 在前端开发中,我们常常需要对数组进行排序操作。而在 ES9 中,Array.prototype.sort() 方法实现了...

    9 个月前
  • 详解 JavaScript 模块系统与 ES6 模块化

    在前端开发中,模块化是一个非常重要的概念。模块化可以将复杂的代码分隔成不同的功能模块,使得代码更加可维护、可复用。JavaScript 的模块化也经历了漫长的发展过程,在 ES6 规范中正式引入了模块...

    9 个月前
  • 使用 Fastify 和 Mysql2 构建 MySQL 后端应用程序

    前言 在前端开发中,我们经常需要和后端进行数据交互。而数据存储和查询方面,MySQL 是较为常用和成熟的解决方案之一。在本文中,我们将介绍如何使用 Fastify 和 Mysql2 构建 MySQL ...

    9 个月前
  • 一次 PWA 应用在 IE 浏览器中兼容性的失败案例分享

    随着移动互联网的快速发展,PWA 应用作为新型的 Web 应用,正在逐渐流行起来。然而,在现实生产环境中,PWA 应用还面临着一些挑战,比如兼容性问题。 本文将分享一次 PWA 应用在 IE 浏览器中...

    9 个月前
  • Koa2 实践 (5) ----- 实现 redis 存储和提取 session 和 Authorization 验证

    在前面的文章中我们介绍了如何使用 Koa2 框架搭建前端服务,如何使用路由和控制器来构建 API 接口,并了解了如何使用中间件来解析请求体和响应体。在本文中,我们将探讨如何使用 Redis 存储和提取...

    9 个月前
  • RESTful API 中的 HATEOAS (超媒体驱动的 web 应用程序)

    RESTful API 是一种开放且通用的协议,用于构建基于 Web 应用程序的 API。它是一种轻量级的方式来访问 Web 资源,提供基于 HTTP 协议的标准化 API 方法。

    9 个月前
  • ES8 中的 Array.prototype.reduceRight() 方法详解和使用场景

    概述 在 ES8 中,Array 原型上新增了一个 reduceRight() 方法,这个方法和 reduce() 操作类似,不同的是它是从右边开始遍历数组。 reduceRight() 方法可以对一...

    9 个月前
  • Next.js 搭建多语言站点的两种实现方式

    本文主要介绍 Next.js 中实现多语言站点的方法,我们将介绍两种不同的实现方式,并给出代码示例。每种方法都有其不同的优缺点,读完本文后,您将能够选择最适合您需求的方法。

    9 个月前
  • Node.js Debug—— 使用 Chrome DevTools 调试

    在进行 Node.js 开发时,总会遇到程序出现错误,而要想有效地找出错误,就需要使用调试工具。Chrome DevTools 是一款常用的调试工具,它可以帮助我们快速定位错误并解决问题。

    9 个月前
  • 如何在 Vue.js 中使用 Tailwind?

    Tailwind 是一款 CSS 框架,它不同于其他 CSS 框架,例如 Bootstrap 和 Foundation。它的思路是提供大量的原子类,而没有任何样式。

    9 个月前
  • Webpack HMR 原理解析

    前端开发中,我们经常需要修改代码并刷新页面来看到效果,这种方式的效率和开发体验都很不理想。Webpack HMR(热更新)可以帮助我们实现快速的代码修改和实时预览,提高开发效率。

    9 个月前
  • Custom Elements:为什么我的自定义元素无法渲染?

    随着 Web 技术的不断发展,前端开发也越来越受到关注。自定义元素是 Web Components 技术中的一部分,可以让开发者自定义 HTML 标签。然而,在实际开发中,有时会发现自定义元素无法渲染...

    9 个月前

相关推荐

    暂无文章