发布于 2026-01-06 8 阅读
0

如何构建离线 Web 应用程序

如何构建离线 Web 应用程序

随着移动设备的日益普及和网络连接的不可靠性,确保网络应用程序即使在用户离线时也能正常运行比以往任何时候都更加重要。

此外,用户还期望网络应用程序可靠、快速,并且停机时间和中断时间尽可能少。

实现这一目标的一种方法是构建渐进式 Web 应用程序 (PWA),这是一种可以安装在用户设备上并离线工作的 Web 应用程序。

本文将探讨用于创建可离线运行且可靠的 Web 应用程序的技术。

一、引言

如今,人们依赖网络应用程序来完成各种任务,从订餐到管理财务。

因此,即使用户没有网络连接,这些应用程序也必须可用。此外,用户期望网络应用程序快速、响应迅速且始终可用。

PWA 是可以安装在用户设备上并离线使用的 Web 应用程序,提供与原生移动应用程序类似的体验。

二、离线能力

PWA 的关键特性之一是其离线工作能力。这是通过将静态资源(例如 HTML、CSS 和 JavaScript 文件)和数据缓存到用户设备上来实现的。存储这些信息的方式有很多种,包括 LocalStorage 和 IndexedDB。

LocalStorage 是一个简单的键值存储,可以存储少量数据,例如用户偏好设置或身份验证令牌。它易于使用,非常适合存储少量数据,但容量有限,无法存储大型数据集。

另一方面,IndexedDB 是一种功能更强大的数据存储系统,允许存储大量结构化数据。它采用面向对象的数据模型,这使得它比 LocalStorage 更复杂,但也更强大。

Service Worker 是一种可编写脚本的网络代理,它允许您控制浏览器如何处理网络请求,包括在网络不可用时从缓存中提供资源和数据。

它独立于 Web 应用程序运行,并且可以在单独的线程上运行,从而可以更有效地管理资产和数据。

三、可靠性

PWA 通过使用 Service Worker 来控制网络请求的处理方式,从而提供可靠的离线体验。Service Worker 可以拦截网络请求,并在从网络请求数据之前检查是否存在缓存的响应。

此外,当网络不可用时,它们可以将请求排队,并在连接恢复后发送这些请求。这使得即使在用户设备离线的情况下,Web 应用程序也能继续运行。

推送通知和后台同步是提升 PWA 可靠性的其他功能。推送通知允许应用在用户未打开的情况下通知用户新内容或更新。相比之下,后台同步允许应用在设备连接到互联网时执行诸如上传数据之类的任务。

IV. PWA实施

有多种库和框架可以帮助开发 PWA。

一个受欢迎的选择是 Workbox,它是 Google 创建的一组库和 Node 模块,可以更轻松地向 Web 应用程序添加 Service Worker 和其他 PWA 功能。

在设计和实现 PWA 时,务必牢记最佳实践,例如设计离线功能、确保快速加载以及使用合适的存储选项。此外,还必须在不同的设备和网络条件下测试 PWA,以确保其正常运行。

成功的 PWA 示例:

  • Twitter Lite是 Twitter 应用的轻量级版本,它使用 PWA 提供离线可用且快速的用户体验。
  • 阿里巴巴是一个流行的电子商务平台,它使用 PWA 为购物者提供快速可靠的线下购物体验。
  • Spotify是一款音乐流媒体应用,它使用 PWA 技术为用户提供离线收听体验。
  • 福布斯是一个商业和金融新闻网站,它使用 PWA 为读者提供快速且可离线使用的体验。
  • Trivago 是一个酒店和旅游价格比较网站,其 PWA 版本提供了更好的用户体验和更快的加载速度。
  • Google Maps Go是一款轻量级应用程序,它使用 PWA 技术提供离线可用且快速的用户体验。

以上仅列举了当今众多 PWA 应用中的几个例子。在各个行业和应用场景中,PWA 越来越受欢迎,并被众多公司广泛采用,以改善用户体验并提供离线功能。

设计和实施 PWA 的最佳实践:

  • 使用 Service Worker 缓存静态资源并处理网络请求
  • 使用 Web 清单文件来指定起始 URL、显示模式和其他 PWA 功能
  • 使用 HTTPS 可确保 PWA 的安全性,并允许 Service Worker 正常运行。
  • 使用响应式设计技术,确保 PWA 在不同设备和屏幕尺寸上都能良好运行。
  • 即使用户离线,也可以使用推送通知和后台同步功能提供可靠的体验。
  • 在不同的设备和网络条件下测试 PWA,以确保其正常工作。
  • 尽可能缩短 PWA 的初始加载时间。
  • 选择合适的存储选项:考虑同时使用 LocalStorage 和 IndexedDB。
  • 利用代码分割、预加载和预缓存等技术优化性能
  • 持续监控和衡量绩效

使用案例:

一款天气 PWA 应用,用户可以使用它查看当前位置或任何搜索位置的天气情况。该应用会缓存天气数据,即使离线用户也能访问这些数据。

为了实现这个 PWA,我们将使用以下技术:

  • 用于应用程序布局和样式的 HTML 和 CSS
  • 用于应用程序逻辑和与 API 交互的 JavaScript
  • 用于获取用户位置的地理位置 API
  • 用于获取天气数据的 OpenWeatherMap API
  • 用于缓存天气数据和资源的 Workbox

以下是该应用程序代码的一个示例:

<!DOCTYPE html>
<html>
<head>
<title>Weather PWA</title>
<link rel="manifest" href="manifest.json">
</head>
<body>
<header>
<h1>Weather PWA</h1>
</header>
<main>
<div id="location"></div>
<div id="weather"></div>
</main>
<footer>
<p>Copyright 2021</p>
</footer>
</body>
</html>
CSS:
body {
font-family: sans-serif;
padding: 0;
margin: 0;
}
header {
background-color: #f1f1f1;
padding: 20px;
text-align: center;
}
main {
padding: 20px;
text-align: center;
}
footer {
background-color: #f1f1f1;
padding: 10px;
text-align: center;
}
Enter fullscreen mode Exit fullscreen mode

// Get the user's location
navigator.geolocation.getCurrentPosition(getWeather);
function getWeather(position) {
const lat = position.coords.latitude;
const lon = position.coords.longitude;
// Make an API request to OpenWeatherMap
fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=<your-api-key>`)
.then(response => response.json())
.then(data => {
const location = data.name;
const temperature = data.main.temp;
// Display the weather data on the page
const locationElem = document.getElementById('location');
locationElem.innerHTML = `Location: ${location}`;
const weatherElem = document.getElementById('weather');
weatherElem.innerHTML = `Temperature: ${temperature}`;
})
.catch(err => console.log(err));
// Register the service worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker
.register('/serviceWorker.js')
.then(() => console.log('Service worker registered'))
.catch(err => console.log(err));
}
serviceWorker.js

// Import Workbox
importScripts('https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js');
// Use the precaching module to cache the app's static assets
workbox.precaching.precacheAndRoute([
{url: '/index.html', revision: '1'},
{url: '/styles.css', revision: '1'},
{url: '/script.js', revision: '1'},
]);
// Use the caching module to cache the weather data
workbox.routing.registerRoute(
/^https:\/\/api\.openweathermap\.org/,
new workbox.strategies.StaleWhileRevalidate(),
);
}
Enter fullscreen mode Exit fullscreen mode
  • 地理位置 API:此 API 允许 Web 应用程序访问用户的位置信息。在上面的示例中,我们使用 ` navigator.geolocation.getCurrentPosition()`方法获取用户的当前位置,并将该信息传递给 ` getWeather()`函数。

  • OpenWeatherMap API:此 API 用于获取特定位置的天气数据。在上面的示例中,我们请求此 API 获取用户所在位置的当前天气数据。我们使用返回的数据在页面上显示了位置和温度。

  • Workbox:Workbox 是一套由 Google 创建的库和 Node 模块,可以轻松地为 Web 应用程序添加 Service Worker 功能。在上面的示例中,我们使用了 Workbox 的预缓存模块来缓存应用程序的静态资源,并使用其缓存模块来缓存天气数据。这样,即使在用户离线的情况下,PWA 也可以访问这些数据。

  • 利用这些技术,我们实现了一个 PWA 示例,该 PWA 能够获取用户位置、获取天气数据并将其缓存,从而提供离线体验。

    请注意,API 密钥和端点 URL 可能有所不同,您需要从 OpenWeatherMap 服务获取一个,并在应用程序中使用它。

    结论

    总之,构建渐进式 Web 应用程序 (PWA) 可以让 Web 应用程序提供离线可用且可靠的用户体验。

    PWA 可以通过利用 Service Worker 缓存资源和数据,即使在用户离线的情况下也能继续运行。此外,通过使用地理位置 API 和 OpenWeatherMap API,PWA 可以收集用户信息并提供个性化体验。

    此外,通过利用 Workbox,开发人员可以快速实现 Service Worker 功能,例如离线缓存和后台同步。

    资源

    文章来源:https://dev.to/scofieldidehen/how-to-build-offline-web-applications-5a9l