解决 PWA 中部分文件缓存生命周期过短的问题

面试官:小伙子,你的代码为什么这么丝滑?

PWA (Progressive Web App)可以让你的网站获得 Native App 的体验,它可以离线访问,并且具备本地缓存和通知功能等特性。其中缓存功能是实现离线访问的关键,但是在实际开发中,会发现部分文件的缓存生命周期过短,需要频繁进行缓存更新,影响用户体验。本文将介绍如何解决这个问题。

缓存生命周期短的原因

在 PWA 中,我们使用 Cache API 来进行文件缓存。它包括两个 API,分别为 Cache 对象和 Service Worker 的 fetch 事件。缓存的生命周期取决于缓存策略和更新策略,这两个策略在 Service Worker 中进行设置。

首先,缓存策略用来确定缓存何时过期。我们可以使用一下策略:

  • no-store(不缓存):每次都会请求最新的资源。
  • no-cache(始终验证):每次都会请求服务器与缓存记录进行比较,如果数据有更新,则会下载新的数据。
  • max-age(缓存有效期):指定缓存的有效时间,单位是秒。

然后,更新策略用来确定何时更新缓存。常用的策略有:

  • cache-first(优先使用缓存):如果缓存中有资源,则直接使用缓存;若缓存中没有资源,则向服务器请求。
  • network-first(优先获取最新数据):如果网络正常,则首先请求服务器并缓存数据,如果网络不通则使用缓存数据。

如果不做设置,默认情况下,浏览器会按照刷新间隔(默认一周)来检查缓存文件是否过期,如果过期则会重新下载。

解决缓存生命周期短的方法

缓存生命周期过短的问题,即需要频繁更新缓存,那么我们需要通过改进缓存策略和更新策略来解决这个问题。

更新缓存策略

首先,我们可以把缓存策略中的缓存有效期增加到一个较长的时间,这样可以减少更新缓存的频率。例如设置缓存有效期为一年:

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

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

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

注意:缓存有效期增加后,服务器修改了资源也不会立即更新,需要等到缓存过期才会重新下载更新。因此,这种方法适合于很少更新的静态资源。

精确判断更新时机

第二种方法是在更新策略中增加额外的判断。我们可以将更新策略改为 network-first,即优先获取最新数据,但是额外增加判断,如果服务器上的资源没有变化,则继续使用缓存。例如:

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

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

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

这样,我们就可以在确保服务器更新了资源的情况下,去更新缓存。但是这种方法需要服务器返回特定的头部信息(如 Last-Modified),并且获取这些信息需要额外的请求,因此比较耗损性能。

结论

准确地确定更新缓存的时机是一个有挑战的问题,因为我们需要考虑多种因素,如用户体验、服务器负载、缓存策略等。通过合理设置缓存策略和更新策略,我们可以最大化地使用缓存,减少网络请求,提高页面性能。

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


猜你喜欢

  • Jest 测试 React 组件中 useReducer 的方法分享

    在前端开发中,测试是非常重要的一部分。当我们使用 React 开发应用程序时,组件是代码的核心部分,对其进行测试将有助于确保代码质量和可靠性。在 React 组件中,使用 useReducer 是一种...

    18 天前
  • 在 Enzyme + React 中测试通过 useCallback() 创建的组件

    在 React 中,被称为 Hooks 的新特性使得我们能够更好地组织组件逻辑。在使用 React Hooks 时,有一种函数型 Hook 叫做 useCallback(),它用于性能优化,常常用来为...

    18 天前
  • Deno 中使用 WebSocket 进行通信

    WebSocket 是一种网络通信协议,可用于在客户端和服务器之间进行双向通信。Deno 是一种现代的 JavaScript 和 TypeScript 运行时环境,具有更好的安全性和可维护性。

    18 天前
  • 如何在 Blazor 项目中集成 TailwindCSS

    TailwindCSS 是一款快速且灵活的 CSS 框架,它能够大大加快前端开发的速度,减少不必要的 CSS 代码。在这篇文章中,我将会向大家介绍如何在 Blazor 项目中集成 TailwindCS...

    18 天前
  • Cypress 错误解决:如何解决突然关闭 Cypress 的问题

    Cypress 是一个非常流行的前端自动化测试框架,但是在使用 Cypress 进行测试时,经常会出现 Cypress 突然关闭的问题。这个问题可能会影响你的测试效率和测试结果的准确性。

    18 天前
  • ES8 模拟 Koa/Express 的异步错误处理中间件

    随着前端技术的不断发展,许多新的框架和库诞生。其中,Koa 和 Express 是两个流行的 Node.js 框架,它们是构建 Web 应用程序的首选框架。虽然它们非常易用,但是开发人员仍然需要花费大...

    18 天前
  • Mongoose 中如何使用 ObjectId 查询文档

    在使用 MongoDB 存储数据时,会经常使用 ObjectId 作为文档的唯一标识符。使用 Mongoose 操作 MongoDB 时,需要掌握如何使用 ObjectId 查询文档。

    18 天前
  • Hapi.js 中的 HTTPS 配置:安全必备

    Hapi.js 是一个流行的 Node.js Web 框架,它提供了许多有用的功能来帮助开发人员构建高性能的 Web 应用程序。其中一个关键的功能是 HTTPS,它可以通过使用安全的 SSL / TL...

    18 天前
  • 如何在 GraphQL 中上传和下载文件

    GraphQL 是一种 API 查询语言,它可以帮助前端开发人员更有效地构建和管理后端 API。在使用 GraphQL 时,与传统 RESTful API 不同的是,客户端可以通过单个请求获取所需的数...

    18 天前
  • 使用 Babel 编译 React Native 时遇到的一些问题及解决方法

    前言 React Native 是一种跨平台移动应用开发框架,用户可以使用 JavaScript 和类似于 CSS 的样式语言来编写应用程序。在 React Native 的开发过程中,使用 Babe...

    18 天前
  • 利用 CSS Grid 布局解决响应式设计问题

    在现代网页设计中,响应式设计是必不可少的一部分。随着设备类型和屏幕大小的多样化,使用传统的布局方式来设计网页已经不再适用。而 CSS Grid 布局,作为一种先进的布局方式,可在各种设备上灵活自适应,...

    18 天前
  • Koa 中对 JWT 的使用及安全性考虑

    随着 web 应用程序变得越来越复杂,保护应用程序的安全性变得越来越重要。JSON Web Token (JWT) 是一种在身份验证和授权方面使用的开放标准。 在本文中,我们将探讨在 Koa 中使用 ...

    18 天前
  • ES7 中的 Generator 函数与异步编程详解

    ES7 中的 Generator 函数与异步编程详解 前端开发中,异步编程是不可避免的话题,主要是因为 JavaScript 是单线程执行的,同步编程会导致阻塞,而异步编程则可以避免这个问题。

    18 天前
  • 优化 React 应用性能的技巧

    React 是一种流行的 JavaScript 库,用于构建大规模、高性能的 Web 应用程序。由于其组件化思想和优秀的虚拟 DOM 算法,React 已经成为前端开发的首选框架之一。

    18 天前
  • 如何使用 Cypress 测试用户验证

    随着 web 应用程序的复杂性和重要性的不断增加,自动化测试已成为开发团队必不可少的一部分。Cypress 是一个流行的前端自动化测试框架,它可以让我们快速、易于理解地测试我们的 web 应用程序。

    18 天前
  • Vue 和 React 和 PWA 的那点事儿

    在前端领域,Vue 和 React 是目前最流行的两个框架,而 PWA (Progressive Web App)则是近年来崛起的新技术。这篇文章将介绍这三个技术的概念、特点、学习和使用过程,以及它们...

    18 天前
  • 使用 Socket.io 实现文件传输的方法

    在前端开发的过程中,有时候需要将文件进行传输。常见的传输方式有 FTP 以及 HTTP。然而这些方式的传输效率低下,还容易出现连接中断等问题。在这里,我们将介绍使用 Socket.io 实现文件传输的...

    18 天前
  • 高效率地使用 Next.js 实现极致页面响应

    前言 在今天这个高速发展的互联网时代,用户对页面响应速度的要求越来越高。如果您是一名前端工程师,那么您一定知道 Next.js 是一个非常流行的前端框架。有了 Next.js,您可以轻松地构建出一个高...

    18 天前
  • 解决在 ES9 中使用 Object.getOwnPropertyNames() 出现的错误

    JavaScript ES9 中,如果你使用 Object.getOwnPropertyNames() 方法,在某些情况下会出现错误。下面我们深入探讨这个问题,并提供解决方法以及示例代码。

    18 天前
  • 使用 ESLint 检测 CSS 的命名规范

    在前端开发中,CSS 的命名规范对于代码的可读性、可维护性和扩展性都非常重要。通过良好的命名规范,可以使得代码更易于理解和修改,提高代码的质量和开发效率。 然而,很多开发者在编写 CSS 的命名规范时...

    18 天前

相关推荐

    暂无文章