PWA 技术教程:使用 SW-Precache-Webpack 插件构建优化缓存

前言

PWA(Progressive Web App)是新一代 Web 应用的标配,它将 Web 应用和 Native 应用进行了有机的结合,让 Web 应用也能像 Native 应用一样拥有更好的用户体验。其中,PWA 缓存技术是 PWA 的核心之一。优化缓存不仅可以提高应用的性能,还可以让应用在离线状态下也能正常运行。本文将分享关于 PWA 的缓存技术方案,其中包括 SW-Precache-Webpack 插件的使用方式。

搭建 PWA 应用

首先,让我们来创建一个 PWA 应用。使用 Create React App 可以方便的创建一个 PWA 应用,可以通过以下命令来创建一个基于 React 的 PWA 应用:

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

执行完命令后,目录结构如下:

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

其中,serviceWorker.js 实现了 PWA 中的缓存逻辑,PWA 的缓存分为两个部分:应用代码缓存和数据缓存。首先,我们需要对应用代码进行缓存优化。

优化应用代码缓存

这里我们使用 SW-Precache-Webpack 插件来实现应用代码的缓存优化。SW-Precache-Webpack 插件可以帮我们生成一个 Service Worker 文件,该文件会缓存所有需要缓存的文件,包括 HTML、CSS、JS、图片等。首先,在项目中安装 SW-Precache-Webpack 插件:

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

接着,在 webpack 配置文件中添加 Plugin:

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

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

其中,cacheId 是 Service Worker 缓存名称,dontCacheBustUrlsMatching 是对文件名进行匹配的正则表达式,缓存时请忽略该正则表示式匹配到的 URL,staticFileGlobsIgnorePatterns 控制在 Service Worker 生成期间将被忽略的文件。

接着,在项目根目录下创建一个名为 manifest.json 的文件,它会告诉浏览器如何安装我们的应用,manifest.json 的内容如下:

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

manifest.json 中 icons 字段中定义了我们应用的图标,start_url 字段定义了应用安装后打开的页面。最后,我们还需要在 public/index.html 文件中添加以下代码段:

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

这里我们引入了 manifest.json,并设置了主题颜色。

现在,重新构建应用,生成的 build 文件夹中会包含 service-worker.jsmanifest.json 两个文件。接下来,我们需要优化数据缓存。

优化数据缓存

服务端的数据一般比较大,为了节约客户端的流量,我们需要让数据可以被缓存。我们使用了 IndexedDB 存储共享的数据,使用了 Cache Storage 保存经常使用的数据。首先,我们需要在 Service Worker 中注册一个全局事件用于对请求进行拦截:

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

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

这里,我们首先查询 caches 缓存中是否有该请求,如果没有则进行网络请求。如果网络请求失败,则返回默认图片 /img-placeholder.svg,也可以用其他合适的方式进行 fallback。

接着,在应用中我们可以通过以下代码来将数据存入 Cache Storage:

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

我们将数据 user 存储到了名为 my-pwa-app-dynamic 的 Cache Storage 中,并以 /api/user 作为缓存键。同样,我们可以通过以下代码来查询缓存中是否存在指定数据:

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

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

这里我们通过 caches.match() 来查询缓存中是否存在对应的数据,如果存在则直接返回对应数据,否则进行网络请求。

总结

本文主要讲解了 PWA 的缓存技术。通过使用 SW-Precache-Webpack 插件可以优化应用代码缓存,而 IndexedDB 和 Cache Storage 对数据进行缓存。这样可以大幅度提高 PWA 应用的性能和用户体验。

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


猜你喜欢

  • Hapi.js 插件之 hapi-garbage 插件详解

    前言 在现代web应用程序中,我们经常需要进行资源管理和垃圾回收。Hapi.js是一个流行的Node.js框架,它可以帮助我们快速构建和管理web应用程序。hapi-garbage插件是一个非常有用的...

    1 年前
  • ECMAScript 2019 引入私有属性:如何使用并避免命名冲突

    前言 在过去,JavaScript 中没有私有属性和方法的概念。开发者通常使用一些命名约定来不直接访问内部方法和属性。例如,使用下划线前缀,比如 _foo,表示该属性为私有属性,不应该被直接访问。

    1 年前
  • docker-compose 环境搭建及常见问题解决方法

    什么是 docker-compose? Docker-compose 是 Docker 公司推出的一个用于定义和运行多个 Docker 容器的工具。使用 Docker-compose,可以通过一个 Y...

    1 年前
  • 解读 ECMAScript 2020 的块级作用域

    在 ECMAScript 2020 规范中,块级作用域(Block-scoped declarations)得到了强化和拓展,从而使得编写 JS 代码变得更加方便和高效。

    1 年前
  • 使用 Sequelize 处理日期类型数据的技巧

    在 Web 开发中,经常会涉及到日期类型数据的处理。Sequelize 是一个 Node.js 中的 ORM 框架,可以帮助我们在后端应用中处理数据库操作。本文将介绍使用 Sequelize 处理日期...

    1 年前
  • Promise.allSettled() 的使用及注意事项

    Promise.allSettled() 是一个ES2020新增的Promise方法,它可以在所有Promise都已经fulfilled或rejected后返回一个数组,该数组包含每个Promise的...

    1 年前
  • 回归 Mongoose:重新定义数据模型设计

    前言 在前端开发过程中,数据库是一个不可或缺的环节。为了更好地设计数据库,使得数据存储可靠、方便管理,需要使用熟悉的数据库框架。近年来,Mongoose 作为一种 Node.js 与 MongoDB ...

    1 年前
  • Fastify 中如何实现静态文件的访问和下载?

    在现代的 Web 应用中,静态文件(如 HTML、CSS、JavaScript 和图像)的发布和管理是非常重要的,因为这些文件是用户在浏览器中渲染页面所必需的组成部分。

    1 年前
  • Redis 集群扩容和缩容的正确姿势

    随着互联网发展,对于数据库的高可用性、高性能、高扩展性等需求也越来越高,而 Redis 作为一个高可用、高性能的 NoSQL 数据库,在这方面表现非常出色。但是,在使用 Redis 集群时,我们需要时...

    1 年前
  • ES6 中的 Symbol 对象与枚举类型的实现

    ES6 中的 Symbol 对象与枚举类型的实现 在 JavaScript 的 ES6 版本中,新增了一种原始数据类型:Symbol。Symbol 是一种不可变且唯一的数据类型,主要用于对象属性名的定...

    1 年前
  • 使用 Flexbox 实现响应式图片列表布局

    在这个移动设备和桌面显示器并存的时代,设计难度增加了,需要考虑到不同设备的显示效果。Flexbox 是一种布局模式,可使响应式设计变得十分容易。本文将介绍怎样使用 Flexbox 实现响应式图片列表布...

    1 年前
  • 如何在 Cypress 中使用自定义的配置文件

    如何在 Cypress 中使用自定义的配置文件 Cypress 是一个非常流行的前端自动化测试框架,它的使用非常简单,但有时候需要对一些配置进行修改,如测试用例所在的路径,测试超时时间等等。

    1 年前
  • Koa-router 中跨域请求的解决方案

    前端开发过程中,经常需要向不同的服务器发送请求,这就涉及到跨域问题。在 Koa 框架中,我们可以使用 koa-router 来进行路由的管理和控制,但是默认情况下,koa-router 并没有提供处理...

    1 年前
  • Vue.js 中如何集成第三方组件库

    Vue.js 是一款非常流行的前端框架,它的生态环境非常丰富。在实际的项目开发中,我们经常会用到一些第三方组件库,比如 Element UI、Ant Design Vue 等。

    1 年前
  • Web 性能优化之减少 HTTP 请求的方法探究

    在 Web 前端开发中,HTTP 请求对页面加载速度和性能影响非常明显。为了提升 Web 应用的性能和用户体验,我们需要尽可能减少 HTTP 请求的次数。本文将深入探究减少 HTTP 请求的方法,探讨...

    1 年前
  • Headless CMS 在构建智能化门户网站的作用

    前言 Headless CMS 是一种新的 CMS 架构方式,其特点是将前端与后台做了解耦,前端的 UI 层可以自行组织数据,而不再依赖后台服务。中文翻译为无头 CMS,是指没有直接管理前端显示的功能...

    1 年前
  • 使用 Server-sent Events 实现带实时搜索的城市天气查询

    在当今互联网时代,实时搜索和实时数据展示已经成为了非常常见的需求。这些实时数据很多时候都是需要通过异步更新的方式展示出来,而在前端开发过程中,Server-sent Events (SSE) 就是一种...

    1 年前
  • ES8 中新增的 for-await-of 循环语句详解

    随着 JavaScript 的飞速发展,越来越多的新语言特性被加入其中,最近 ES8 中新增了一个 for-await-of 循环语句,让我们一起来看看这个新特性的详细信息和学习指导。

    1 年前
  • Enzyme 测试 Redux 的 React 组件方法

    Enzyme 是一个流行的 React 测试工具,它提供了一种简单而强大的方式来测试 React 组件。当我们需要测试 Redux 和 React 组件的结合时,Enzyme 成为了有力的助手。

    1 年前
  • Angular使用RxJS+WebSocket长连接实现消息推送

    随着前端技术的不断变化和发展,Web应用也越来越复杂,接收实时消息推送的需求越来越普遍,因此实现消息推送成为了前端开发中的一个重要而且切实可行的问题。本文将介绍如何使用RxJS和WebSocket技术...

    1 年前

相关推荐

    暂无文章