PWA 离线缓存机制深入研究及实战应用

前言

随着互联网的普及和移动设备的广泛应用,Web 应用越来越重要。但是,Web 应用天生具备的一些特性(如网络延迟、带宽限制)仍然给用户带来不良体验。Progressive Web Apps (PWA) 正是为了解决这些问题而诞生的。

PWA 不仅能够在任何地方、任何时间点使用,而且可以像本地应用一样使用,具有更快的响应时间和更高的可靠性,使用户的体验得到了大大提升。其中的一个重要机制就是离线缓存。

什么是 PWA 离线缓存

在传统的应用程序中,用户必须使用互联网才能连接到服务器来获取数据和交换信息。而 PWA 可以在用户离线时通过使用先前缓存的数据来提供用户体验。这种机制就是 PWA 离线缓存机制。

PWA 离线缓存机制分为两部分: 应用程序缓存服务工作线程

应用程序缓存

应用程序缓存(AppCache)是一种机制,可以对所需的文件执行离线缓存,这样我们就可以在断网的情况下访问应用程序,同时避免每次从服务器下载资源。离线缓存的文件包括HTML文件、JavaScript文件、CSS 文件、图像文件、字体文件等。

在一个 Web 应用中,我们使用 HTML 文件作为应用的入口。因此应用程序缓存机制的工作原理是,我们把 HTML 文件中的资源缓存下来,并将这个 HTML 文件转化为一个缓存清单文件(manifest),Cache Manifest。这个文件中包含了一个应用程序所需的所有文件的 URL ,页面在离线时将始终从缓存中获取资源。

当用户请求 PWA 时,浏览器接收到 HTML 时就会一并读取其引用的相应文件并存入缓存中,当用户下次离线访问时,会优先从缓存中获取对应的资源,提供了更快的响应速度。

当需要更新缓存中的文件时,开发者必须更新 Cache Manifest 文件,让用户手动刷新才能获取最新的版本内容。

服务工作线程

Web Workers 是浏览器开发者工具提供的功能,JavaScript 代码在 Web Workers 中运行,并与主线程中的代码互不干扰。而 Service Workers 是 Web Workers 的一种特殊类型,不仅在主线程外运行,而且还能拦截、处理、缓存网络请求,以及在网络连接被断开时使用缓存数据响应请求。所以 PWA 离线缓存机制是基于 Service Workers 实现的。

Service Workers 本质上是通过 JavaScript 编写的后台线程,类似于计算机中的守护进程,独立于浏览器进程运行。Service Worker 可以监听浏览器请求的网络流量,处理请求并返回相应的结果。同时,Service Worker 还能够拦截网络请求并直接使用离线缓存中的数据对其进行响应,这就可以实现在离线情况下为用户提供资源的需求。

PWA 离线缓存的使用

接下来将以一个例子来说明如何使用 PWA 离线缓存。

实战应用

使用 PWA 实现一个简单的 To-Do List,主要使用 HTML、CSS、JavaScript 和 PWA 离线缓存机制。

步骤 1:创建 PWA

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

可以看出,该 PWA 的主要资源就是 index.html、style.css、app.js 和 sw.js,这些文件需要离线缓存。

在 index.html 文件中,我们通过引入 manifest 文件及 sw.js 文件实现了 PWA 的创建。

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

manifest.json 文件中包含了 PWA 所需的所有资源。

步骤 2:创建 Service Worker

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

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

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

在 sw.js 文件中,我们开启了一个缓存并将 index.html、style.css 和 app.js 文件添加到缓存中。同时,我们在 fetch 事件中匹配请求的路由并返回对应的缓存数据,这样就实现了在离线情况下从缓存中加载数据的功能。

步骤 3:开启 PWA 功能

在 Chrome 浏览器中,开启开发者工具,打开 Application 面板,并勾选上 Service workers 和 Manifest 选项。

勾选完 Service workers 和 Manifest 选项后,刷新浏览器页面,可以看到后台成功注册了一个 Service Worker。

步骤 4:验证缓存机制

我们可以关闭网络状态,然后刷新浏览器,查看是否仍然可以正常使用 PWA 应用程序。

以上几个步骤就可以创建一个简单的 PWA 应用,并实现其离线缓存机制。

为什么要使用 PWA 离线缓存

PWA 离线缓存机制是基于 Service Workers 实现的,它可以极大地改善偶发的网络连接问题,提高 Web 应用程序的性能和可靠性。此外,它提供了多种缓存策略,开发者可以根据不同的需求选择不同的缓存策略。

使用 PWA 离线缓存能够带来以下好处:

  1. 大大提高 Web 应用程序的性能和可靠性;
  2. 减少服务器负担;
  3. 推动 Web 应用程序在设备上的使用率,带来更好的用户体验。

结论

本文介绍了 PWA 离线缓存机制的具体实现步骤及使用场景,并通过实例代码示范,帮助读者了解 PWA 离线缓存的具体使用。PWA 离线缓存可用于提高 Web 应用程序的性能和可靠性,在未来开发中值得进一步探索和应用。

参考文献

  1. MDN:PWA
  2. Service Workers 简介
  3. 构建一个无网络应用(OFFLINE APP)
  4. Google Developers:离线 Web 应用

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6718d919ad1e889fe22e7ce7