发布于 2026-01-05 0 阅读
0

PWA 和 Service Worker 简介

PWA 和 Service Worker 简介

渐进式 Web 应用

渐进式 Web 应用(简称 PWA)正变得越来越流行。在本文中,我将向您介绍什么是渐进式 Web 应用,以及如何使用 Service Worker 创建一个 PWA。

什么是PWA?

PWA(渐进式Web应用)是一种旨在像原生应用一样在手机上运行的应用。它是一个普通的Web应用,当您在浏览器中打开它时,会显示
添加到主屏幕”的消息。点击该消息后,应用将被安装到您的手机上,您将在设备的主屏幕上看到它的图标。

PWA(渐进式Web应用)越来越受欢迎,因为它们有助于提升用户访问网站的体验。访问传统网站可能需要几秒钟的时间。然而,由于使用了Service Worker,PWA的加载速度显著加快。

你的设备上可以安装三种类型的应用程序:

-原生 -
杂交
-PWA

原生应用:在我看来,除非你使用高画质,并且需要与设备进行大量用户交互(例如玩游戏),否则我会选择原生应用。原生应用开发成本较高,因为需要双倍的投入和时间——需要为 Android 和 iOS 分别开发两个应用。

混合开发:这是一个不错的选择,因为它使用同一套技术栈,可以从相同的源代码分别构建 Android 和 iOS 平台的版本。如果你的应用对速度和图形性能要求不高,我建议使用混合应用。混合应用可以通过使用原生代码构建的插件来访问设备硬件。

PWA 怎么样?

PWA:与以往类型的应用程序相比,PWA 开发成本更低、速度更快,而且支持离线使用!开发 PWA 的方式与开发普通响应式 Web 应用程序类似,区别在于需要添加Service Worker来实现离线支持,以及将应用程序安装到主屏幕等功能。

什么是服务人员?

Service Worker 是一个独立于我们网站运行的脚本,它在后台运行。Service Worker 非常强大,可以帮助我们实现各种功能,例如缓存页面、缓存 API 调用、推送通知、后台同步等等。

  • 服务工作线程可以缓存网络请求。

  • Service Worker可以处理网站中的网络请求。

  • 服务工作线程可以使用后台同步 API,该 API 允许您将操作延迟到用户连接稳定时执行。

  • 服务工作线程无法直接访问/交互 DOM。

  • 服务工作线程可以缓存您网站上的内容,例如静态资源。

  • 即使应用未处于活动状态,服务工作线程也能接收推送通知。

  • 服务工作线程在不使用时保持非活动状态。当它收到需要使用的“信号”时,就会重新激活。

  • 可以使用Service Worker让你的应用离线也能运行。

Service Worker 的生命周期

-注册服务工作线程

Service Worker 生命周期的第一步是注册 Service Worker。您可以使用以下代码进行注册:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js');
}
Enter fullscreen mode Exit fullscreen mode

谷歌的 Jeff Posnick 在他的一篇关于 Service Worker 的文章中教了我一个小技巧。这个技巧可以简单地改进 Service Worker 的注册过程。

if ('serviceWorker' in navigator) {
  window.addEventListener('load',()=> {
    navigator.serviceWorker.register('/service-worker.js');
  });
}
Enter fullscreen mode Exit fullscreen mode

这段代码会在整个页面加载完毕后注册服务工作线程,但请记住,这样做可能会延迟服务工作线程的注册。

-安装 Service Worker:此过程仅在 Service Worker 加载完成后调用一次。如果您修改了现有的 Service Worker,浏览器将更新并重新安装 Service Worker。

install在 Service Worker 安装过程中会触发一个事件。您可以处理此事件,并在需要时执行一些异步操作(例如,缓存静态资源)。为此,您可以使用`event.waitUntil()`。此方法会使 Service Worker 保持在当前阶段,直到传递给`event.waitUntil()`install的Promise被解析为止。根据该 Promise 是被解析还是被拒绝,该阶段要么成功完成,要么失败。install

要安装 Service Worker,我们需要执行以下操作:

1)打开缓存。2
)缓存文件。3
)确认所有必需资源是否都已缓存。

const web_cache = 'web-app-cache-v1.0';
const filesToCache = [
  '/',
  '/styles/styles.css',
  '/script/main.js'
  ....
];

self.addEventListener('install',(event)=> {
  event.waitUntil(
    caches.open(web_cache)
      .then((cache)=> {
        //Cache has been opened successfully
        return cache.addAll(filesToCache);
      })
  );
});
Enter fullscreen mode Exit fullscreen mode

以下是如何在浏览器中直接检查 Service Worker 是否已成功安装和注册的说明。

在 Chrome 浏览器中(废话)

1) 打开开发者工具。2
) 在工具栏中点击“应用程序”
。3) 在左侧,你会看到一个侧边栏。点击“Service Worker”。4
) 你应该会看到类似以下内容:
屏幕截图 2020-01-12 下午 4:03:27

-激活 Service Worker

Service Worker 可以在不同场景下进入激活状态。以下列举了一些场景:

  • 我们的应用中没有现有的 Service Worker。
  • 我们在 Service Worker 中运行 ` self.skipWaiting()`方法。
  • 用户已离开页面,释放了之前活动的 Worker。
  • 经过一段时间后,之前的活跃员工将被释放。

-活动服务工作线程:

当服务工作线程处于活动状态时,您可以在注册对象中检查其状态。

navigator.serviceWorker.register('./service-worker.js').then((registration)=> {
    if (registration.active) {
        console.log('Service worker is active');
    }
})
Enter fullscreen mode Exit fullscreen mode

-冗余服务工作线程

Service Worker 可能由于以下原因而出现冗余(即出现错误):

  • Service Worker 安装失败
  • 服务工作线程在激活时失败
  • 新的 Service Worker 会替换现有的 Service Worker,成为活动的 Service Worker。

就到这里啦!

资料来源

- https://developers.google.com/web/fundamentals/primers/service-workers
- https://bitsofco.de/the-service-worker-lifecycle/
- https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle

文章来源:https://dev.to/thisdotmedia/intro-to-pwa-and-service-workers-15d4