PWA 的离线缓存与更新机制详解

什么是 PWA

PWA 是 Progressive Web App 的缩写,中文名为渐进式 Web 应用。它是一种新型的 Web 应用程序模型,具有可以安装、离线使用、接近原生应用的用户体验等特点。PWA 能够让 Web 应用程序在移动设备上运行得更快,更加流畅,并且可以将更多的功能发布到用户手中。

PWA 的离线缓存机制

离线缓存是指将 Web 应用的资源缓存到本地,使得应用可以在离线状态下使用。对于 PWA 应用来说,离线缓存是其最重要的特性之一。

PWA 的离线缓存机制主要依靠浏览器的 Service Worker 技术。Service Worker 是一种独立于 Web 页面的 JavaScript 脚本,它可以代理 Web 请求,并将响应存储到浏览器的缓存中。它可以在浏览器后台运行,使得 Web 应用即使没有打开也可以得到更新和缓存资源。

安装 Service Worker

要使用 Service Worker 技术,需要在 Web 应用的 JavaScript 中编写相应的代码。在 JavaScript 中注册 Service Worker 的代码如下所示:

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

在上面的代码中,我们首先判断当前浏览器是否支持 Service Worker,如果支持就在页面加载完成后注册 Service Worker。register 方法的第一个参数是 Service Worker 脚本的路径,第二个参数指定了该 Service Worker 的作用范围。当 Service Worker 注册成功后,我们可以在控制台中看到相应的输出信息。

缓存资源

接下来我们需要在 Service Worker 中添加缓存资源的代码。在 Service Worker 中,我们需要监听 install 事件,在该事件中完成资源的缓存。

例如,在下面的代码中,我们使用 caches.open() 方法打开一个名为 my-cache 的缓存库,并通过 cache.addAll() 方法将相关资源添加到缓存中:

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

在上述例子中,我们将根目录、index.html、main.css、main.js 和 logo.png 等资源添加到了缓存中。这些资源可以根据应用需求定制。在应用启动时,Service Worker 会自动下载这些资源并将它们保存在浏览器缓存中。在下一次访问应用时,浏览器就可以直接从缓存中获取这些资源,而不需要再次从服务器端下载。这样就能够实现离线访问。

获取缓存资源

当应用离线时,我们需要从缓存中获取已经缓存的资源。在 Service Worker 中,我们需要将 fetch 事件拦截下来,从缓存中获取相应的资源。

例如,下面的代码可以将所有请求的响应缓存到 my-cache 缓存中,并在当前缓存无法找到请求资源时,从网络中获取资源。

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

在上述例子中,我们首先通过调用 caches.match() 方法检查缓存中是否有匹配的响应,如果有,直接返回它。如果没有,就从服务器端获取响应,并将该响应存储到缓存中。

PWA 的更新机制

PWA 的另一个重要特性是可以自动更新。通过 Service Worker 技术,可以使得 PWA 应用的资源始终保持最新。

一旦用户访问应用程序,Service Worker 就会在后台检查有没有更新,如果有更新将会自动下载和安装。在更新过程中,Service Worker 会先安装新的版本,然后再将旧的版本移除。一旦更新完成,PWA 就会在用户下次访问应用时展示新的内容。

更新 Service Worker

在 Service Worker 中,我们需要手动调用 skipWaiting() 方法,在 Service Worker 安装成功后立即激活新的 Service Worker,并取代旧的 Service Worker。

例如,在下面的代码中,我们可以检测到新版本的 Service Worker 脚本已经下载完成,并开始安装。在安装完成后,我们会调用 skipWaiting() 方法,以激活新版本的 Service Worker。

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

在调用 skipWaiting() 方法后,新版本的 Service Worker 将会被激活,然后立即取代旧的 Service Worker。

监听更新事件

在 Service Worker 中,我们可以添加一个 activate 监听器,以便检测到新版本的 Service Worker 已经取代了旧的版本。利用该监听器,我们可以完成一些清理旧版本缓存等工作。

例如,下面的代码中,在 activate 事件触发时,我们可以通过调用 caches.keys() 获取所有的缓存名称,然后将它们与当前版本的缓存名称进行比较。如果某个缓存不在当前版本中,就将其删除掉。

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

在上述例子中,我们首先调用 caches.keys() 方法获取所有的缓存名称,然后遍历每一个缓存名称。如果当前缓存名称不在当前版本的缓存库列表中,就将其删除。

总结

PWA 的离线缓存和更新机制是该技术最为核心的特性之一。它通过 Service Worker 技术来实现缓存和自动更新,使得 PWA 应用可以获得接近原生应用的用户体验。开发者可以通过合理地使用 Service Worker 技术,提升 Web 应用程序的性能、可靠性和用户体验。

希望本篇文章对大家了解 PWA 的离线缓存和更新机制有所帮助。祝您编程愉快,欢迎提出宝贵建议和意见。

示例代码:https://github.com/alipay/pwa-demo/tree/master/offline-cache

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


猜你喜欢

  • 最好的 Node.js 框架 - Express vs Koa vs Fastify

    随着 Node.js 越来越受欢迎,越来越多的开发者开始尝试使用它来构建 Web 应用程序。在 Node.js 生态系统中,有很多流行的框架可以帮助开发者轻松构建可靠和高效的 Web 应用程序。

    9 个月前
  • Custom Elements 中的动态组件加载及最佳实践

    前言 在现代 Web 应用中,组件化已经成为开发者们的标配,然而,在一些特定的场景下,静态加载的组件不能满足我们的需求。针对这种情况,Custom Elements API 提供了一种强大的动态组件加...

    9 个月前
  • Socket.io 在 electron 中实现桌面应用的实时通信

    简介 Socket.io 是一个基于 Node.js 的实时通信库,具有简洁易用、可靠性高、可扩展性强等特点。而 electron 是一个使用 Node.js 和 Chromium 构建桌面应用的框架...

    9 个月前
  • SSE(Server-Sent Events) 服务端推送技术深度剖析

    随着 Web 技术的不断发展,越来越多的应用需要实现实时通信。传统的轮询技术明显存在性能问题,WebSocket 技术虽然弥补了这个问题,但使用起来更为复杂。而 SSE(Server-Sent Eve...

    9 个月前
  • 如何在 LESS 中设置 HTML 字体大小

    LESS(Leaner Style Sheets)是一种动态样式语言,它可以方便地写出可维护的 CSS 代码。在前端开发中,经常需要设置 HTML 文字的大小。本文将详细介绍在 LESS 中如何设置 ...

    9 个月前
  • 常见的 Tailwind 错误及解决方法

    Tailwind 是一个简单易用的 CSS 框架,它基于实用主义的设计理念,通过类名的方式提供了大量且易于理解的样式工具,可以让开发者快速构建出美观而且高效的界面。

    9 个月前
  • for-await-of 循环的使用,解决 ES8 中的异步迭代器问题

    for-await-of 循环的使用:解决 ES8 中的异步迭代器问题 在 ES8 中,提供了一种新的特性:异步迭代器。异步迭代器允许我们像普通迭代器一样遍历异步数据源,但是其迭代行为是异步的,可以处...

    9 个月前
  • SASS 编译错误: Expected expression, was ',',怎么办?

    在前端开发中,SASS 是一种非常重要的 CSS 预处理器,它可以帮助开发者更加灵活和高效地编写 CSS,提高代码的可维护性和可扩展性。但是,有时候在编译 SASS 文件时会出现一些错误,如编译错误:...

    9 个月前
  • 在 Hapi 中使用 Mongoose 数据库模块

    在现代的 Web 开发中,数据库扮演了一个至关重要的角色。与此同时,遵循正确的设计原则和 ORM 工具选择也非常重要。Mongoose 是 Node.js 中最受欢迎的 MongoDB ORM 库之一...

    9 个月前
  • Chai 如何在 Node.js 中捕获 Ajax 请求,用于单元测试?

    想要对前端项目进行单元测试,就需要对项目中各个模块进行测试,包括 Ajax 请求。而在 Node.js 环境下,捕获 Ajax 请求则需要使用 Chai 库。 Chai 简介 Chai 是一个针对 N...

    9 个月前
  • ES11 新特性:Nullish Coalescing 运算符

    随着 Javascript 的不断发展,它的新增特性也越来越多。其中,ES11 中最具代表性的新特性之一就是 Nullish Coalescing 运算符,这个运算符可以帮助开发者更好地处理空值(un...

    9 个月前
  • ES10 中的 Symbol 对象及应用详解

    什么是 Symbol 对象 Symbol 是一个新的基本数据类型,引入自 ES6。它是一个唯一的、不可改变的值,可以用作对象属性的键值。 我们可以使用 Symbol() 函数来创建一个新的 Symbo...

    9 个月前
  • ECMAScript 2018 中的 Promise finally 方法详解及实际应用

    Promise finally 方法是 ECMAScript 2018 中新增的 Promise 方法之一,它可以在 Promise 成功或失败后,无论是 resolve 还是 reject,都会执行...

    9 个月前
  • 基于 Google App Engine 构建的不容错过的 Serverless 尝试

    概述 近年来,Serverless 架构的概念在云计算领域越来越受到重视。Serverless 架构是一种无服务器架构,即不需要用户自己管理服务器,而是将应用程序托管在云服务提供商的服务器上实现弹性伸...

    9 个月前
  • Deno 中如何使用第三方登录服务

    前言 随着社交媒体的发展和普及,第三方登录服务越来越受欢迎,因为它不仅方便用户登录,还可以减少用户注册的时间和步骤,同时还可以增强网站的安全性。 在 Deno 中,我们可以使用第三方登录服务,比如 G...

    9 个月前
  • 自定义元素:使用原生 JavaScript 实现 Web Components

    Web Components 是一种自定义 HTML 元素的技术,已经成为前端领域中广泛使用的一种技术。Web Components 可以让我们创建符合标准的、可重用的、可组合的自定义元素。

    9 个月前
  • 解决 Koa.js 中使用 bodyParser 时获取不到请求体的问题

    在使用 Koa.js 框架开发 web 应用时,我们经常需要获取请求体来处理用户提交的数据。而 bodyParser 是一个 Node.js 应用程序中常用的中间件,它可以把 HTTP POST 请求...

    9 个月前
  • 解决 GraphQL 查询与 Prisma models 同步的问题

    前言 在使用 GraphQL 和 Prisma 的时候,我们通常会将 GraphQL 查询和 Prisma models 定义在不同的文件中。这会导致一个问题:当我们修改了 Prisma models...

    9 个月前
  • LESS 中的命名空间及模块化的使用方法

    LESS 是一种 CSS 预处理器,它可以让我们写出更加简洁、优雅的 CSS 代码。在实际开发中,我们需要使用一些模块化的方法来组织 LESS 代码,以便于维护和扩展。

    9 个月前
  • 使用 SSE 的实时 Web 应用案例

    在 Web 开发中,实时数据的显示一直是一个重要的问题。在传统的客户端-服务器模式中,客户端需要不断地向服务器发送请求,才能获取最新的数据,这不仅浪费带宽,也会增加服务器的压力。

    9 个月前

相关推荐

    暂无文章