PWA的探索与应用

article/2025/9/21 6:31:01

本文由云+社区发表

PWA(Progressive Web App)起源背景

传统的Web网页存在以下几个问题:

  • 进入一个页面必须要记住它的url或者加入书签,入口不便捷;
  • 没网络就没响应,不具备离线能力;
  • 不像APP一样能进行消息推送。

Native app:

  • 开发成本高
  • 软件上线需要审核
  • 即使使用频率不高,想使用一个app必须先下载安装

PWA概念的提出

2016 年Google I/O 大会上提出一个 Next Web Generation 的概念。PWA是在传统Web应用的基础上,结合Manifest和service worker,完善Web应用的一些能力,比如:

  • 添加至主屏幕,点击主屏幕图标可以实现启动动画以及隐藏地址栏
  • 实现离线缓存功能,即使用户手机没有网络,依然可以使用一些离线功能
  • 消息推送

PWA技术点

Web App Manifest

Web App Manifest 技术实现了将PWA网页应用 添加至桌面的功能,但该项技术目前仍处于实验性阶段,各浏览器支持度不高

imgimage.png

PWA 站点部署的 manifest.json文件满足以下条件时会自动显示横幅:

- short\\_name (主屏幕显示)
- name (安装横幅显示)
- icons (必须包含一个 mime 类型为 image/png 的图标声明)
- start\\_url (应用启动地址)
- display (必须为 standalone 或 fullscreen)
- 站点注册 Service Worker。
- 站点支持 HTTPS 访问。
- 同一浏览器中站点至少被访问两次,间隔至少为 5 分钟。

Service Worker

​ PWA应用的离线体验、定期的后台同步以及推送通知等功能的实现依赖于Service Worker技术,下图为目前SW技术的支持度。

img

SW具有以下特征:

  • 一个独立的 worker 线程,独立于当前网页进程,有自己独立的 worker context。
  • 一旦被 install,就永远存在,除非被手动 unregister
  • 用到的时候可以直接唤醒,不用的时候自动睡眠
  • 离线内容开发者可控
  • 能向客户端推送消息
  • 不能直接操作 DOM
  • 必须在 HTTPS 环境下才能工作
  • 异步实现,内部大都是通过 Promise 实现

Service Worker生命周期

img

  • installing:这个状态发生在 SW 注册之后开始安装,install 事件回调中执行skipWaiting()方法表示强制当前处在 waiting 状态的 Service Worker 进入 activate 状态。
  • installed:SW已经完成了安装,等待其他的 SW 线程被关闭。
  • activating:在这个状态下清除其他的worker 以及关联缓存的旧缓存资源,等待新的 SW线程被激活。在 activate 事件回调中执行self.clients.claim()方法表示取得页面的控制权, 这样之后打开页面都会使用版本更新的缓存。旧的 Service Worker 脚本不再控制着页面,之后会被停止。
  • activated:在这个状态可以处理功能性的事件 fetch (请求)、sync (后台同步)、push (推送)。
  • 废弃状态 ( redundant ):这个状态表示一个 Service Worker 的生命周期结束。

Service Worker 支持的事件

img

  • install:Service Worker 安装成功后被触发的事件, 在事件处理函数中可以添加需要缓存的文件
  • activate:当 Service Worker 安装完成后并进入激活状态,会触发 activate 事件。通过监听 activate 事件你可以做一些预处理,如对旧版本的更新、对无用缓存的清理等。
  • message:Service Worker 运行于独立 context 中,无法直接访问当前页面主线程的 DOM 等信息,但是通过 postMessage API,可以实现他们之间的消息传递,这样主线程就可以接受 Service Worker 的指令操作 DOM。
  • fetch :当浏览器在当前指定的 scope 下发起请求时,会触发 fetch 事件,并得到传有 response 参数的回调函数。fetch 事件特别重要,因为它能够定义你的缓存策略。也就是说,你可以决定何时使用缓存数据,何时使用网络请求来的数据。
  • push:push 事件是为推送准备的。通过 PUSH API,当订阅了推送服务后,可以使用推送方式唤醒 Service Worker 以响应来自系统消息传递服务的消息,即使用户已经关闭了页面。
  • sync:sync 事件由 background sync (后台同步)发出。background sync 是 Google 配合 SW 推出的 API,用于为 Service Worker 提供一个可以实现注册和监听同步处理的方法。但它还不在 W3C Web API 标准中。在 Chrome 中这也只是一个实验性功能,需要访问 chrome://flags/#enable-experimental-web-platform-features ,开启该功能,然后重启生效。Sync 事件允许延迟网络任务,直到用户连接上网络,它实现的功能通常被称为后台同步。这对于在离线模式下,确保用户启动的任何有网络依赖的任务,最终都将在网络再次可用时达到其预期目的,是非常有用的。

Service Worker 的工作原理

Service Worker是基于注册、安装、激活等步骤

注册

if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {navigator.serviceWorker.register('/jslearning/sw.js') // 默认作用域为jslearning下,也可以通过设置scope参数进行设置.then(function (registration) {// 注册成功console.log('ServiceWorker registration successful with scope: ', registration.scope);}).catch(function (err) {// 注册失败:(console.log('ServiceWorker registration failed: ', err);});
});
}

安装

this.addEventListener('install', function(event) {console.log('V1 installing…');//需要缓存的重要的高优先级资源var vipUrlsToPrefetch = [
'./index.html'];//次重要的资源var urlsToPrefetch = [
'./icon.png'];event.waitUntil(
caches.open(OFFLINE_CACHE_NAME).then(function(cache) {//urlsToPrefetch非重要资源,即使有资源加载失败也不影响Service Worker安装cache.addAll(urlsToPrefetch);//vipUrlsToPrefetch中资源全部请求成功,Service Worker安装事件才顺利完成,可以进入激活事件return cache.addAll(vipUrlsToPrefetch);
}));      
});

激活

//Service Worker激活事件
this.addEventListener('activate', function(event) {//在激活事件中清除非当前版本的缓存避免用户存储空间急剧膨胀event.waitUntil(caches.keys().then(function(cacheNames) {
console.log('V1 activate');
return Promise.all(cacheNames.map(function(cacheName) {if (cacheName !== OFFLINE_CACHE_NAME) {if(cacheName.indexOf(OFFLINE_CACHE_PREFIX) != -1) {return caches.delete(cacheName);}}
}));}));
});

Service Worker更新

  • 如果线程的字节与已有的SW线程字节不同,浏览器则考虑更新SW线程。
  • 更新的SW线程与现有SW线程一起启动,并获取自己的 install 事件。
  • 如果新工作SW线程出现不正常状态代码(例如,404)、解析失败,在执行中引发错误或在安装期间被拒,则系统将舍弃新工作线程,但当前工作线程仍处于活动状态。
  • 安装成功后,更新的工作线程将 wait,直到现有工作线程控制0个客户端。
  • self.skipWaiting() 可跳过等待情况,这意味着sw线程在安装完后立即激活。

Service Worker缓存策略

​ Service Worker缓存策略大部分在fetch与install时间中定义,对于某些固定不变的静态资源,可以在Service Worker初次安装的install事件中将其缓存,但资源过大或者网络不佳都会造成资源并未全部下载成功而导致Service Worker安装被中断安装失败。SW主要有以下几类缓存策略:

  • 不影响安装的资源预缓存
  • 渐进式缓存
  • 仅使用缓存、仅使用网络
  • 缓存优先 、网络优先
// 渐进式缓存
var addToCache = function(req) {   return fetch(req.clone()).then(function(resp) {   var cacheResp = resp.clone();if (!resp.ok) {return resp;}caches.open(OFFLINE_CACHE_NAME).then(function(cache) {cache.put(req.clone(), cacheResp);});return resp;});
};this.addEventListener('fetch', function(event)  {event.respondWith(caches.open(OFFLINE_CACHE_NAME).then(function(cache) {return cache.match(event.request);}).then(function(response) {if (response) {return response;} else {return addToCache(event.request);}})); 
});

PWA应用可以通过开发者工具中的Application进行查看调试,如下图所示:

img

PWA优缺点总结

优点

  • 可以将app的快捷方式放置到桌面上,全屏运行,与原生app无异
  • 能够在网络差和断网条件下
  • 推送消息的能力
  • 快速响应用户指令

缺点

  • 支持率不高
  • Chrome在安卓移动端上的占有率很低
  • 依赖的GCM服务在国内无法使用
  • 微信小程序的竞争

PWA应用

  • Lavas 是一套基于 Vue 的 PWA 解决方案,能够帮助开发者快速搭建 PWA 应用
  • 新浪微博
  • 饿了么
  • Instagram
  • Twitter
  • Offline Wikipedia
  • Spotlight

参考文献

  • https://developers.google.com/web/progressive-web-apps/
  • https://developer.mozilla.org/en-US/docs/Web/Apps/Progressive
  • https://lavas.baidu.com/pwa
  • https://x5.tencent.com/tbs/guide/serviceworker.html
  • https://segmentfault.com/a/1190000012353473#articleHeader0
  • https://blog.csdn.net/baidu_browser/article/details/64440238

此文已由作者授权腾讯云+社区在各渠道发布

获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号


http://chatgpt.dhexx.cn/article/3bZt7ia2.shtml

相关文章

PWA 应用列表及常用工具

引言 在做 PWA 的过程中自己写了一些相关的应用和工具,在这里整合下,方便记录及查找使用。 应用列表 PWA 支持检测工具番茄钟二维码生成新闻应用身体数据统计应用支付宝集福应用田英章书法字典应用抖音无水印下载应用很好用的备忘录精神氮泵 PWA 支持检…

【技术】PWA实践 - 应用激活与安装

文章目录 你能用这项技术做什么?适合人群你可以学到什么 应用激活与安装激活与安装Manifest注意 Service WorkerStorage 管理应用 Demo本章参考资料 你能用这项技术做什么? 使用PWA能让你的web网页在支持使用最新版本Chome浏览器的桌面端(wi…

正确使用PWA

作为一个前端程序员,在没有任何Android/IOS的开发情况下,想想我们有多少种方法来开发一个原生移动应用程序!我们可以有非原生、混合开发,PWA等等手段。类似uniapp,Reactive native为我们提供了更简便的手段&#xff01…

PWA应用入个门

文章目录 什么是PWA应用核心技术清单如何添加PWA应用到手机苹果手机:安卓手机: PWA应用VS微信小程序参考资料 什么是PWA应用 PWA(Progressive Web App)是一种理念,使用多种技术来增强web app的功能,可以让网站的体验变得更好&…

什么是 PWA?有什么用?送三本《PWA入门与实践》!

很高兴受到《PWA入门与实践》作者王乐平老师的邀请,为这本书写推荐语。 下面我们就听听作者王老师带你快速玩转 PWA 吧! 文末有给各位粉丝的福利!抽奖送出三本《PWA入门与实践》。 导读:如今,互联网大流量早已进入了移…

关于PWA的各种问题

目录 前言 PWA的简单了解和需求 项目manifest.json和sw的无脑生成神器 安装 注册 动态配置manifest.json IOS无法获取webpack-pwa-manifest中配置的icon 来自因为需求而产生的静态manifest.json的坑 前言 — 以下结论和方法均为个人摸索,涵盖从度娘那儿找到…

PWA 概念及核心功能的基本介绍

目录 一. PWA 概念介绍 1.1 什么是 PWA? 1.2 为什么会出现 PWA? 1.3 如何判断一个 web 应用是 PWA? 二. PWA 核心功能 2.1 何谓 Service Worker 2.2 注册 Service Worker 2.3 Service Worker 常用事件 2.3.1 install 2.3.2 fetch 2.4 Manife…

PWA系列:第一章 PWA使用场景分析

前言 2018年4月份起微软的应用商店上线第一批PWA应用以来,近一年随着safari开始支持ServiceWorkers,国内浏览器厂商也逐步开始大力加持,到本课程发稿起95%以上的浏览器都支持了PWA的横幅安装。PWA轻应用也逐渐被广大站点使用和推广。 PWA轻应…

PWA(Progressive Web App)入门系列:(一)PWA简介

前言 PWA做为一门Google推出的WEB端的新技术,好处不言而喻,但目前对于相关方面的知识不是很丰富,这里我推出一下这方面的入门教程系列,提供PWA方面学习。 什么是PWA PWA全称Progressive Web App,直译是渐进式WEB应用…

一文读懂什么是 PWA?

什么是 PWA? 1. 概念2. 特性3. 功能4. 优势与劣势5. 发展 1. 概念 PWA 是 Google 于 2016 年提出的概念,于 2017 年正式落地,于 2018 年迎来重大突破,全球顶级的浏览器厂商,Google、Microsoft、Apple 已经全数宣布支持…

PWA(Progressive Web App)入门系列:(三)PWA关键技术Manifest

前言 前面说过,让Web App能够达到Native App外观体验的主要实现技术就是PWA中的manifest技术,本章会详细说明manifest的实现,及各个参数的具体含义,还将了解如何定义Web App的启动图标、启动样式等。 简介 manifest是一种简单的…

一文了解PWA——Progressive Web App

近年来,出现了一种新的应用开发模式——PWA(Progressive Web App,即渐进式Web应用)。今天就来为大家分享什么是PWA,以及它与小程序的区别、技术原理。 PWA的基本概念和技术原理 PWA是一种基于Web技术的应用开发模式&a…

PWA相关知识

http://www.leiphone.com/news/201606/UEiart497WUzS62u.html 我们真的需要网页版App吗?Google PWA的困局 其实回来的两周里,我对Progressive Web App(以下简称 PWA)的理解也在不断更新,现在是思考更为全面的时候。 一…

PWA介绍及快速上手搭建一个PWA应用

PWA初次体验 ​ 前言:本示例不用安装任何东西 部分资源来自网络资源及PWA官网,不要把PWA想象的太复杂,跟着示例走一下,你行的。 PWA介绍 一个新的前端技术,PWA( 全称:Progressive Web App &…

PWA详解

PWA(Progressive Web App,渐进式网页应用,逐渐接近原生app的web app)是一种理念,使用多种技术来增强web app的功能,可以让网站的体验变得更好,能够模拟一些原生功能,比如通知推送。在…

PWA应用

一、什么是PWA应用 一个新的前端技术,PWA( 全称:Progressive Web App )也就是说这是个渐进式的网页应用程序。 官网:https://developers.google.com/web/progressive-web-apps/ 是 Google 在 2015 年提出,…

汽车金融风控企业如何开展风控体系建设

汽车融资租赁主要有直租和回租两种模式,相对回租业务而言,直租因更具盈利优势和用户体验优势而备受瞩目。2017年大搜车、易鑫、优信和瓜子等巨头纷纷涉足直租领域,厂家金融和经销商集团金融机构随后跟上,直租模式在国内开始呈现井…

重磅分享:一份关于车贷的政策性文件分享

关注公众号“番茄风控大数据”,获取更多数据分析与风控大数据的实用干货。 不同领域不同产品的策略跟政策要点肯定是不同的,对车贷而言因为有车这个标的物,车会移动会跑,为了应对这个相关的风险点,我们就会对标的物做跟…

线下产品风控门道真不少

关注 “番茄风控大数据”,获取更多数据分析与风控大数据的实用干货。 “你好,请问这里是肯蝶科技有限公司吗?请问这里,有没有一个叫小明的人在这里上班?” “您好!对,这里是肯蝶科技有限公司。…

贷后风控中逾期案件差异化的分配逻辑

在风控精细化运营的当下,贷后工作的开展,越来越需要精细化管理。 今天我们总结梳理了番茄风控之前的内容并结合近期开展的内容,为大家带来一个催收模型优化和逾期案件催收差异化策略的内容,详细请看本文介绍。 一.催收模型 在催收…