PWA 中 Service Worker 的使用技巧总结

前言

随着网页的不断发展,PWA(Progressive Web Apps)已经形成了一种新的网页应用程序的范式,它具有像本地应用程序一样的功能和用户体验,同时又无需下载和安装。其中,Service Worker 是实现 PWA 的关键技术之一。

在这篇文章中,我们将详细介绍 Service Worker 技术,并给出一些实用的技巧和指导,帮助开发者更好地应用 Service Worker 技术。

什么是 Service Worker?

Service Worker 是一个运行在浏览器背后的 JavaScript工具,它能够拦截并处理来自浏览器的所有网络请求,包括页面、图片、资源等,从而可以实现离线缓存、消息推送等高级功能。

Service Worker 本质上是一个脚本,它可以在浏览器进程和网络中间建立一个缓存层,以便在没有网络连接时可以提供离线支持,同时也可以通过缓存加速网页加载。

Service Worker 的生命周期是完全独立于网页的,它可以在网页关闭后继续运行,并保持和服务器的连接。这意味着 Service Worker 可以在后台执行一些任务,例如预载入资源、更新缓存等。

PWA 中的 Service Worker

PWA 中通过 Service Worker 实现以下功能:

  • 离线缓存:在没有网络连接时,通过 Service Worker 技术可以让网页依然可以访问,仅仅只是没有实时数据的更新。对于一些需要频繁访问的数据可以通过离线缓存减少重复请求,提高网页访问效率。
  • 快速加载:通过 Service Worker 技术可以将页面的资源预缓存,网页打开速度会得到很大的提升(如像素级预缓存)。
  • 消息推送:通过 Service Worker 技术可以将消息推送给用户,相比传统的安卓 APP,可以获得更好的体验,同时还可以节省用户的流量。
  • 后台任务:Service Worker 一旦被安装后就可以在后台周期性地执行任务,如资源的更新、数据预载等操作。

Service Worker 基本用法

下面我们来介绍 Service Worker 的基本用法,首先需要对 Service Worker 进行注册。一旦 Service Worker 被注册,当满足某些条件时,浏览器就会使用其运行时。

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

注册代码里的 sw.js 就是我们定义的 Service Worker 脚本,这里也可以通过作用域的方式来限制 Service Worker 的路径,提高效率和安全性。

Service Worker 脚本有以下两个生命周期事件:

  • install:当 Service Worker 第一次安装时触发的事件,通常用于缓存静态资源和其他必要的资源。
  • activate:当 Service Worker 激活时触发的事件,通常用于清理缓存、处理版本升级等。

下面是一个简单的 Service Worker 脚本示例:

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

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

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

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

在这个脚本中,我们将 v1 版本的资源进行了缓存,并在缓存命中时返回缓存中的数据。如果缓存没有命中,则向网络发送请求,并将从网络获取到的资源放入缓存中。

Service Worker 高级技巧

清除旧版本的缓存

每次更新 Service Worker 代码时,都需要清除旧版本的缓存。这个问题可以通过在激活事件中实现:

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

绕过 Service Worker

如果需要在特定的情况下绕过 Service Worker,可以使用 fetch 事件来完成这个需求。例如,在访问特定 URL 时需要禁用缓存,可以使用以下代码:

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

如果请求 URL 包含 /disable-sw/,就直接使用 fetch 去获取。

更新资源缓存

有些资源是需要在更新后马上生效的,例如首页的新闻列表等。这时需要立即清除缓存并重新获取数据,可以这样来实现:

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

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

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

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

在这段代码中,我们使用 BroadcastChannel 来建立页面和 Service Worker 之间的通信通道,并通过监听 sw-update 事件来控制页面的更新和响应。

在 Service Worker 中可以使用以下代码让发送消息到页面:

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

在页面中可以通过 BroadcastChannelmessage 事件来接受并响应消息:

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

通过这种方式,我们可以在没有新版本的缓存时的使用老的 Service Worker,同时可以在有新版本的时候立即更新从而避免缓存旧版数据的问题。

结论

在文章中,我们介绍了 PWA 中的 Service Worker 技术,并给出了相应的示例代码和指导,希望可以帮助大家更好地理解和应用 Service Worker 技术,从而构建出更好的 PWA 应用程序。

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


猜你喜欢

  • 使用 Next.js 开发高性能的电子商务网站

    在现代互联网时代,电子商务网站的需求日益增长。在这样的背景下,有一个快速、轻便、可扩展以及稳定的网站框架至关重要。Next.js 正是一款符合这些条件的网站框架。 本文将为您介绍使用 Next.js ...

    7 天前
  • 在 Docker 中遇到 “permission denied” 错误该如何处理?

    在 Docker 中遇到 “permission denied” 错误该如何处理? 当在 Docker 中运行前端应用程序时,可能会遇到 “permission denied” 错误,这是因为容器内的...

    7 天前
  • 解决 Flexbox 布局中的字体大小自适应问题

    前言 Flexbox 布局是一种非常流行的前端布局方式,其中最困扰开发者的问题之一就是如何解决字体大小自适应的问题。这篇文章将会向你展示一些解决这个问题的方法。 方案一:使用 vw 单位 使用 vw ...

    7 天前
  • 如何解决 Deno 在 Windows 环境下启动慢的问题

    Deno 是一个由 Ryan Dahl 创建的运行时环境,它支持 JavaScript 和 TypeScript,并集成了许多有用的工具,如测试运行器、代码格式化器和依赖引擎。

    7 天前
  • 优化 LESS 代码的几点小技巧

    LESS 是一种 CSS 预处理语言,它提供了很多强大的功能,例如变量、嵌套、混合、函数等,可以帮助我们更好地组织和管理 CSS 代码。然而,如果不注意规范和优化,LESS 代码也会变得冗长、难以维护...

    7 天前
  • Mocha 测试框架:如何组织测试套件的方式

    Mocha 测试框架:如何组织测试套件的方式 Mocha 是一个 JavaScript 测试框架,具有丰富的功能和易用性,广泛应用于前端开发。Mocha 提供了很多选项来组织测试套件,灵活性很高,但也...

    7 天前
  • 使用 CSS Reset 时需要注意的常见问题

    在前端开发中,我们通常使用 CSS Reset 来消除不同浏览器间默认样式的差异。这是一种优化页面显示的重要方法。但是,在实际应用中,使用 CSS Reset 时会存在一些常见问题,本文将针对这些问题...

    7 天前
  • Strapi Headless CMS 的部署与优化:系统性能提升、数据备份等

    随着网站和应用程序的数量不断增加,管理和维护内容的工作变得越来越困难。 Strapi Headless CMS 是一款用于构建灵活且易于管理的内容管理系统(CMS)的工具,提供了许多功能,例如 API...

    7 天前
  • Hapi.js 中如何实现多语言支持

    在现代的 Web 应用中,支持多语言功能是必不可少的。在 Hapi.js 中,通过使用插件和中间件可以很方便地实现这个功能。本文将详细介绍如何在 Hapi.js 中实现多语言支持,包含深度和学习意义,...

    7 天前
  • SSE 与 AJAX 的比较及在实际项目中如何选择使用

    在前端开发中,我们常常需要从服务器读取数据,而 AJAX 和 SSE 是常用的两种方式。本文将深入比较 SSE 和 AJAX,分析它们在实际项目中如何选择使用,并提供相关示例代码。

    7 天前
  • CSS Grid 实现响应式电商布局的完美方案

    在日益发展的电商市场中,设计一个恰当的响应式布局方案变得越来越重要。传统的布局方案难以满足不同屏幕尺寸的需求,而 CSS Grid 提供了一种简单、易于实现、高效的响应式布局方案。

    7 天前
  • 无障碍设备开发中的智能化技术应用

    前言 在数字化社会中,无障碍设备的意义越发重要,因为它们不仅有助于社会的包容性,而且能够改善人们的生活和工作质量。在这项技术上,智能化技术也有着至关重要的作用,因为它们可以大大改善无障碍设备的可用性和...

    7 天前
  • 使用 Chai 断言库时如何针对不同的测试场景进行优化

    前言 在前端开发中,测试是极其重要的一环。而使用断言库可以让我们更好的进行测试,并且提高代码的质量和稳定性。Chai 是一个流行的断言库,允许您通过可读性高、自然语言的语法对您的代码进行断言。

    7 天前
  • Docker 中如何使用 Volume 进行数据持久化?

    前言 Docker 是目前最受欢迎的容器技术之一,可以快速地启动、部署和管理应用程序。然而,在 Docker 容器中运行的应用程序在容器删除或重新创建时,容器内的数据也会被删除或重置,这可能会对应用程...

    7 天前
  • Angular 中如何实现地图标记

    在现代 Web 开发工作中,使用地图是一个非常常见的场景。在 Angular 中,实现地图标记需要结合第三方地图库以及官方提供的 @agm/core 库。 准备工作 首先,需要选择一个合适的地图 AP...

    7 天前
  • ECMAScript 2021:新特性 Private Methods 详解

    前言 ECMAScript 2021 是 JavaScript 的最新版本,该版本提供了许多令人兴奋的新特性,其中包括诸如 Private Methods(私有方法)等一些新的概念和语言功能。

    7 天前
  • 使用 Socket.io 实现实时群聊

    在前端应用中实现实时群聊是一个非常常见的需求,而 Socket.io 是一个能够提供实时、双向通信的 JavaScript 库,使用它可以轻松实现前端应用中的实时聊天室功能。

    7 天前
  • 疯狂解读 Headless CMS:从原理到实践

    什么是 Headless CMS? Headless CMS (无头 CMS) 是指一种内容管理系统,它的特点是后端(Content Management System, CMS)与前端(Front-...

    7 天前
  • Cypress测试如何处理页面滚动问题

    前言 Cypress 是一个前端自动化测试框架,它提供了一些强大的 API 来实现测试,例如选择元素、输入数据、点击按钮等。 然而,在处理一些需要页面滚动的测试用例时,Cypress 可能会遇到一些问...

    7 天前
  • 使用 Vue.js 和 Webpack 构建单页面应用

    前言 单页面应用 (SPA) 是一种现代化的 Web 应用程序,通过异步加载和更新页面的方式为用户提供与桌面应用程序类似的体验。Vue.js 是一个流行的前端框架,它提供了一些强大的工具来构建 SPA...

    7 天前

相关推荐

    暂无文章