PWA 技术升级指南:Service Worker 于 Background Sync

阅读时长 7 分钟读完

前言

PWA(Progressive Web App)在前端应用中正变得越来越流行。它能够为前端应用提供与原生移动应用一样的用户体验,包括离线使用、推送通知等功能。其中,Service Worker 和 Background Sync 是实现 PWA 功能的两个关键技术。

在本文中,我们将深度讲解 Service Worker 和 Background Sync 技术,并给出相应的示例代码,帮助读者更好地理解和应用这两个技术。

Service Worker

Service Worker 是浏览器提供的一个 JavaScript 独立线程,可以控制页面或站点的网络请求和响应。它的主要作用是可以将一些耗时的操作(如网络请求的响应等)放到后台线程上,不会阻碍主线程的运行,从而提高应用的性能表现。

Service Worker 的实现流程

  1. 注册 Service Worker

要使用 Service Worker,我们首先需要在应用中注册一个 Service Worker。可以在页面的 JavaScript 中使用如下代码片段:

-- -------------------- ---- -------
-- ---------------- -- ---------- -
  ------------------------------------------------------
    ------------------ -- -
      -------------------- ------ -------
    --
    ------------ -- -
      -------------------- ------ -------
    ---
-
展开代码
  1. 编写 Service Worker

一旦注册了 Service Worker,就需要在 service-worker.js 文件中编写业务代码,实现各种功能。

示例代码如下所示:

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

------------------------------ ----- -- -
  ------------------
    ---------------------------
      -------------- -- -
        -- ---------- -
          ------ ---------
        -
        ------ ---------------------
      --
  --
---
展开代码

以上代码中,我们使用 self.addEventListener() 函数来监听 Service Worker 的事件,其中 install 事件在 Service Worker 安装时触发,而 fetch 事件会在每次有网络请求时触发。

具体功能实现如下:

  • install 事件函数中,我们使用 caches.open() 函数打开一个名为 my-cache 的缓存空间,并添加几个文件到缓存中。这样,在未来的网络请求中,我们就可以通过缓存来直接响应客户端请求,从而提高应用的性能表现。
  • fetch 事件函数中,我们通过 caches.match() 函数查找指定请求所对应的缓存,如果能够找到,就直接返回缓存;否则,我们使用 fetch() 函数来向服务器发出请求,并返回响应结果。
  1. Service Worker 生命周期

一旦 Service Worker 注册成功,并被激活,它就会进入到生命周期流程,根据事件的触发,进行各种业务逻辑处理。下面是 Service Worker 的生命周期流程图:

Background Sync

使用 Service Worker 能够实现离线缓存,但并不能解决离线时无法向服务器提交数据的问题。这时,我们就需要使用 Background Sync 技术,将需要提交的数据保存下来,待联网后再进行提交。

Background Sync 的实现流程

  1. 注册 Service Worker

与 Service Worker 相同,我们需要先注册 Service Worker。代码如下所示:

-- -------------------- ---- -------
-- ---------------- -- ---------- -
  ------------------------------------------------------
    ------------------ -- -
      -------------------- ------ -------
    --
    ------------ -- -
      -------------------- ------ -------
    ---
-
展开代码
  1. 编写 Service Worker

类似于 Service Worker,我们也需要在 service-worker.js 文件中编写 Background Sync 的业务代码。

示例代码如下所示:

-- -------------------- ---- -------
----------------------------- ----- -- -
  -- ---------- --- ------------ -
    ----------------
      -- ---------
      ------------------ -
        ------- -------
        ----- ------------------- -- ----- ---------
        -------- -
          --------------- ------------------
        -
      --
    --
  -
---
展开代码

以上代码中,我们使用 self.addEventListener('sync', event => {...}) 函数来监听 Background Sync 事件,并在事件触发时,将数据提交到服务器。

  1. 调用 Background Sync

在需要在离线状态下提交数据时,我们调用 navigator.serviceWorker.ready.then(registration => {...}) 函数来获取 Service Worker 的实例,并调用其中的 registration.sync.register('sync-data') 函数来触发 Background Sync。示例代码如下所示:

当客户端处于离线状态时,我们在调用 Background Sync 时,会将请求保存在浏览器的队列中,并在恢复网络时自动进行提交。

总结

Service Worker 和 Background Sync 是 PWA 中优秀的技术,它们能够为前端应用提供许多有用的功能和功能,如离线缓存、离线数据提交等。通过本文的介绍,读者能够更好地理解和应用这两个技术,从而提高前端应用的性能表现和用户体验。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6479bbd6968c7c53b05b3f2b

纠错
反馈

纠错反馈