前言
随着互联网的普及和移动设备的广泛应用,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 离线缓存能够带来以下好处:
- 大大提高 Web 应用程序的性能和可靠性;
- 减少服务器负担;
- 推动 Web 应用程序在设备上的使用率,带来更好的用户体验。
结论
本文介绍了 PWA 离线缓存机制的具体实现步骤及使用场景,并通过实例代码示范,帮助读者了解 PWA 离线缓存的具体使用。PWA 离线缓存可用于提高 Web 应用程序的性能和可靠性,在未来开发中值得进一步探索和应用。
参考文献
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6718d919ad1e889fe22e7ce7