Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >该用什么姿势来使用 PWA

该用什么姿势来使用 PWA

作者头像
IMWeb前端团队
发布于 2019-12-03 10:25:10
发布于 2019-12-03 10:25:10
7740
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队

本文作者:IMWeb 黎清龙 原文出处:IMWeb社区 未经同意,禁止转载

注:本文需要有一定的 PWA 基础

1. 什么是 PWA?

要知道一个东西是什么,我们通常可以从它的名字入手

因此我们看下 PWA 的全称是: Progressive Web App

回答 what 这种问题,重点在于名词,因此 PWA 是一个 APP,一个独立的、增强的、Web 实现的 APP

要达到这样的目的,PWA 提供了一系列的技术 & 标准,如下图所示:

具体每一项技术是什么就不再赘述了,感兴趣的同学自行网上搜索! 下面有一个简单的 demo 可以简单体会一下:

以后我们的 web 站点可以像 app 一样,这难道不是一个令人兴奋的事情吗?

所以 PWA 是值得我们前端开发者一直关注的技术!

按照目前的兼容性和环境来看,大家应用最多的还是 Service Worker,因此接下来我们也是把重点放在 SW 上面

那什么是 Service Worker ?

大家都知道就不卖关子了,其实就是一个 Cache

说到 Cache,就一定会想到性能优化了,请看我们的第二部分

2. 首屏优化

2.1. 静态资源优化

如何利用 Cache 来进行优化?这个基本套路应该无人不知了:

那么首次加载怎么办呢?首次加载是没有缓存资源的,所以会走到线上,所以等于没有任何优化

答案就是 Cache 的第二种常用技巧: precache(预加载)

预加载的意思就是在某个地方或特定时机预先把需要用到的资源加载并缓存

我们的做法如下图所示:

构建的时候,把整个项目用到的资源输出到一个 list 中,然后 inline 到 sw.js 里面

当 sw install 时,就会把这个 list 的资源全部请求并进行缓存

这样做的结果就是,无论用户第一次进入到我们站点的哪个页面,我们都会把整个站点所有的资源都加载回来并缓存

当用户跳转另外一个页面的时候,Cache 里面就有相应的资源了!

这是我们辅导课堂页面接入 sw 之后的首屏优化效果:

2.2. 动态数据优化

除了静态资源之外,我们还能缓存其他的内容吗?

答案肯定是可以的,我们还可以缓存 cgi 数据

缓存 cgi 数据的流程和缓存静态资源的流程主要有2个差别,上图标红的地方:

  1. 需要添加一个开关功能,因为不是所有 cgi 都需要缓存的!
  2. 页面需要展示最新的数据,因此在返回缓存结果之后,还需要请求线上最新的数据,更新缓存,并且返回给页面展示,也就是说页面需要展示2次

页面展示2次需要考虑页面跳动的体验问题,选择权在于业务本身!

这是我们辅导上课页接入该功能后的首屏优化效果:

动态数据缓存是否有意义还需要额外的逻辑来判断,这块暂时是没有做的,后续会补上相关统计

2.3. 直出html优化

还能缓存什么?我们想到了直出的 html

这里就不展开讲了,因为我们的 jax 同学已经分享了一篇优秀的文章《企鹅辅导课程详情页毫秒开的秘密 - PWA 直出》,可以去看看哈~

3. 替代离线包

PWA 与离线包本质上是一样的,都是离线缓存

正好,我们 PC 客户端的离线包系统年久失修,在这个契机下,我们启动了使用 PWA 替换离线包的方案!

核心流程不变,基本和缓存静态资源的流程是一致的

但是离线包系统是非常成熟的系统,要完全替换掉它还需要考虑许多方面的问题。

3.1. 更新机制

离线包有个自动更新的机制,每隔一段时间就会去请求离线包管理系统是否有更新,有的话就把最新的离线包拉下来自动更新替换,这样只需要1次跳转就能展示最新的页面。

SW 没有自动更新的逻辑,它需要在页面加载(一次跳转)之后才会去请求 sw.js,判断有变化才会进行更新,更新完了要等到下一次页面跳转(二次跳转)才能展示最新的页面。

这里有两个方案:

  1. 参考离线包的更新机制,也给 SW 实现一个自动更新的逻辑,借用 update 接口是可以做到主动去执行 SW 更新的。但是非常遗憾,我们的客户端 webkit 内核版本太低,并不支持这个接口
  2. 在第一次跳转之后更新 sw,然后检测 sw 状态,发现如果有更新,就用一定的策略来进行页面的刷新

我们使用第2个方案,部分代码如下:

在检测到 sw 更新之后,我们可以选择强刷,或者提示用户手动刷新页面,具体实现页面可以通过监听事件来处理

更多详细的实现方案可以参考这篇文章哈:How to Fix the Refresh Button When Using Service Workers

3.2. 首次打开问题

一般离线包是打进 app 的安装包一起发布的,在用户下载安装之后,离线包就已经存在于本地,因此第一次打开就能享受到离线包的缓存。

但是 sw 没有这个能力,同样我们也有两个方案:

  1. 在 app 安装的时候,添加一步,通过创建 webview 加载页面,页面执行 SW 的初始化工作,并展示相应的进度提示,在安装完成后需要把 webview 的 SW Cache 底层文件 copy 到相应的安装位置。这个方案太复杂,衡量下来没有采用
  2. 在 app 启动时,创建一个隐藏的 webview,加载空页面去加载 SW。

我们使用第2个方案,因为我们的 app 启动会先让用户登录,如下图所示:

注:这里 app 不是移动端 app,是 pc 的客户端 app

3.3. 屏蔽机制

有时候我们不想使用离线缓存能力,比如在我们开发的时候

在离线包系统,通常会有一个开发者选项是【屏蔽离线包】

SW 也是需要这种能力的,这个方案就比较简单了,在 sw.js 的逻辑里有一个全局的开关,当开关关闭时,就不会走缓存逻辑

因此,我们可以在 dev 环境下把开关关闭即可达到屏蔽的作用

3.4. 降级方案

当我们发布了一个错误代码的时候,我们需要快速降级容错的能力

在离线包系统里面有个过期的功能,可以把某个版本设置过期,也就是废弃掉:

我们利用之前提到的全局开关,通过一个管理接口来设置开关的起开和关闭,即可达到快速降级的目的:

整个流程大致是这样:

  1. 发布了错误代码,并且用户本地 sw 已经更新缓存了错误代码
  2. 在管理端关闭使用缓存开关,让用户走线上
  3. 快速修复代码并发布,到这里页面就已经恢复正常
  4. 在管理端开启使用缓存开关,恢复 SW 功能

请求管理接口是轮询的,这里后续有计划会改成 push,这样会更加及时,当然还要详细评估方案之后才能落实。

4. 如何方便接入?

我们把上述功能集成到了一个 webpack 插件当中,在构建的时候就自动输出 sw.js 并把相关内容注入到 html 文件中,该插件正准备开源哈~

5. 未来

未来对于 PWA 还能做些什么?笔者以为有以下 2 个方面

5.1. 业务深耕

目前通用的能力已经基本挖掘完成,但是 SW 因为它独特的特性,它能做的事情太多了,但是具体要不要这么做也是因业务而异,而且这些内容可能会很复杂,所以我称为业务深耕。

SW 什么特性?请看下面 2 张图就可以理解了

这种架构相信已经能够看出来了,没错,SW 有间件(层)的特性,那它能做的东西就太多了(虽然 SW 是用户端本地中间层)

简单举几个例子:

  1. server 负载控制:当发现 server 端高负载时,SW 可以丢弃请求,或者缓存请求,合并/延迟发送。
  2. 预请求:SW 能预缓存的资源是可以构建出来的资源,但是我们还有许多资源是不能在构建阶段知道的,比如图片,第三方资源等,SW 在返回资源请求(比如HTML、cgi 数据)之后,可以扫描资源里面的内容,如果发现包含了其他资源的 url,那说明页面很有可能待会就会请求这些资源,这时 SW 可以提前去请求这些资源;再比如翻页的数据
  3. 缓存自动更新:通过与 server 建立联系,当数据有变化时,server 直接把最新的数据 push 到 SW 进行缓存的更新

5.2. 关注 PWA

回到最开始,PWA 是一项令人兴奋的技术,但是浏览器兼容有限,因此期待并关注 PWA 技术的发展是很有必要的!

当然,能推动就更好了!比如推动我们的 X5 内核尽快支持新特性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
带你走进PWA在业务中的实践方案
本文由 IMWeb 团队成员 lq 首发。点击阅读原文查看 IMWeb 社区更多精彩文章。 注:本文需要有一定的 PWA 基础 1. 什么是 PWA? 要知道一个东西是什么,我们通常可以从它的名字入手 因此我们看下 PWA 的全称是: Progressive Web App 回答 what 这种问题,重点在于名词,因此 PWA 是一个 APP,一个独立的、增强的、Web 实现的 APP 要达到这样的目的,PWA 提供了一系列的技术 & 标准,如下图所示: 具体每一项技术是什么就不再赘述了,感兴趣的同学自行
用户1097444
2022/06/29
7050
带你走进PWA在业务中的实践方案
企鹅辅导课程详情页毫秒开的秘密 - PWA 直出
随着近几年的前端技术的高速发展,越来越多的团队使用 React、Vue 等 SPA 框架作为其主要的技术栈。以 React 应用为例,从性能角度,其最重要的指标可能就是首屏渲染所花费的时间了。那么今天,我们要给大家分享的一个把优化做到极致的故事。
思衍Jax
2018/12/03
2.8K1
PWA---新生代手机APP
最近公司里让我研究PWA,经过几天的研究发现PWA竟是如此万能,功能接近手机原生APP,最大的优点是它的离线缓存机制,这主要得益于ServiceWorker!
我被狗咬了
2019/09/23
7810
PWA---新生代手机APP
PWA 入门
渐进式 web 应用 (Progressive web apps) 简称为 PWA。它可以给用户原生应用的体验。
多云转晴
2020/05/13
1.8K0
PWA - 令人惊奇的web用户体验新方法
install 事件回调中有两个方法: * event.waitUntil():传入一个 Promise 为参数,等到该 Promise 为 resolve 状态为止。 * self.skipWaiting():self 是当前 context 的 global 变量,执行该方法表示强制当前处在 waiting 状态的 Service Worker 进入 activate 状态。 * 安装后( installed ):Service Worker 已经完成了安装,并且等待其他的 Service Worker 线程被关闭。 * 激活( activating ):在这个状态下没有被其他的 Service Worker 控制的客户端,允许当前的 worker 完成安装,并且清除了其他的 worker 以及关联缓存的旧缓存资源,等待新的 Service Worker 线程被激活。
江米小枣
2020/06/16
2.9K0
PWA - 令人惊奇的web用户体验新方法
PWA介绍及快速上手搭建一个PWA应用
一个新的前端技术,PWA( 全称:Progressive Web App )也就是说这是个渐进式的网页应用程序。
游魂
2018/05/15
2.5K0
PWA 技术落地!让你的站点(Web)秒变APP(应用程序)
Web应用方兴未艾,我们已经十分习惯习惯了在电脑上进行以自己的工作,而随着众多功能强大的在线网站,我们的Windows的桌面也不再拥挤着各种快捷方式;不光是PC端,在移动端我们也不再在浩如烟海的应用市场安装各种软件,轻量级的各种小程序取代了他们的位置,无需安装点开即用的方式为大家的工作生活带来了很大便利。
葡萄城控件
2022/05/09
2.8K0
PWA 技术落地!让你的站点(Web)秒变APP(应用程序)
PWA之离线缓存(一)
PWA全称是Progressive Web Apps, 是一种渐进式增强 WEB 应用。 这里的渐进式增强是指无论用户用的是什么浏览器都能保证应用能正常工作。
IMWeb前端团队
2019/12/03
2.1K0
PWA之离线缓存(一)
H5 秒开方案大全
http://www.alloyteam.com/2019/10/h5-performance-optimize/
刘小夕
2020/08/28
1.6K0
Webpack实战-构建离线应用
你的网页性能优化的再好,如果网络不好那也会导致网页的体验差。 离线应用是指通过离线缓存技术,让资源在第一次被加载后缓存在本地,下次访问它时就直接返回本地的文件,就算没有网络连接。
IMWeb前端团队
2019/12/03
8250
Webpack实战-构建离线应用
开发一个渐进式Web应用程序(PWA)前都需要了解什么?
自苹果推出了iPhone应用商店以来,App成为了我们生活中不可或缺的一部分,而对于实体业务也是如此,现在各行业都在推出自己的App,但有没有人想过这样一种场景,如果自己的潜在客户还没有安装你的App亦或是即便安装但因为客户的手机存储空间紧张而卸载掉了你的App?那有没有使App更轻量,更易安装的技术实现呢?答案是“有的”。
葡萄城控件
2020/09/14
1.9K0
开发一个渐进式Web应用程序(PWA)前都需要了解什么?
在项目中使用Service Worker 与 PWA
Web Worker 是浏览器内置的线程,用于执行非阻塞事件循环的 JavaScript 代码。由于 JavaScript 是单线程语言,一次只能处理一个任务。复杂任务的出现可能导致主线程被阻塞,严重影响用户体验。Web Worker 的作用是允许主线程创建 worker 线程,使它们可以同时运行。Worker 线程主要负责处理复杂的计算任务,然后将结果返回给主线程。简而言之,worker 线程执行复杂计算,同时保持页面(主线程)的流畅性,不会造成阻塞。
linwu
2023/10/16
7270
在项目中使用Service Worker 与 PWA
移动端体验优化经验总结与实践
很多企业都会特别注重自己产品的体验,尤其是移动端,那移动端的体验为什么这么重要?首先体验本身就很重要,好的体验带给用户的感受是截然不同的,用户选择使用一个产品除了产品本身功能满足需求之外,还有一个更重要的原因就是产品用起来“爽”,产品整个使用流程必然是舒适自然,才能受到大众喜爱;此外,产品体验已成为市场竞争力之一,借用人人都是产品经理上面对体验的论述:
ConardLi
2019/11/12
1.7K0
Workbox5+Webpack4构建离线应用
将应用中的静态资源缓存是目前最主流的性能优化方法,甚至能让应用秒开!目前常见的缓存方式有http缓存、memory cache、disk cahce、localstorage、Service worker缓存等方式,本文介绍的Workbox就是实现Service worker离线缓存的一个工具。
乐圣
2022/11/19
1.4K0
Workbox5+Webpack4构建离线应用
service worker 使用
每次页面加载成功后,就会调用 register() 方法,浏览器将会判断 service worker 线程是否已注册并做出相应的处理。 scope 参数是可选的,默认值为 sw.js 所在的文件目录。 打开 chrome 浏览器, 输入 chrome://inspect/#service-workers 可以可以用 DevTools 查看 Service workers 的工作情况。
李振
2021/11/26
1.6K0
service worker 使用
使用传统前端技术增强客户端缓存能力
前几天重构之后,Lighthouse 中有一个评分让我念念不忘: ProgressiveWebApp。
soulteary
2023/03/05
8110
使用传统前端技术增强客户端缓存能力
更真、更强、更快的Web应用-Progressive Web Apps
0.Progressive Web Apps 2016年Progressive Web Apps(文后简称PWA)风劲较大,本文作者详细梳理了PWA现状,希望能帮助读者更深入了解PWA,主要内容如下: PWA定义:描述一下PWA的缘起与使命。 PWA技术:说明完成PWA开发需要使用哪些技术,主要介绍Web App Manifest(使web更像native)、Service Workers(增强web能力)、Application Shell(提升web效率)等使用场景和基本原理。 PWA优势:通过相关
yuanyi928
2018/04/02
1.9K0
更真、更强、更快的Web应用-Progressive Web Apps
如何重新认知性能优化及其度量方法
我是来自 UC 内核团队的林洁伟,海愚是我的花名。今天我将分享的主题是如何重新认识性能优化及其度量方法。
winty
2021/07/01
1.2K0
如何重新认知性能优化及其度量方法
PWA 那些事儿
企鹅号小编
2017/12/28
2K0
PWA 那些事儿
2025 年了,我不允许你还不知道 vite-plugin-pwa
最近在给项目加 PWA 支持时,发现 vite-plugin-pwa 真的是一个又强大又丝滑的插件! 本文就带大家系统了解一下它的安装使用、核心功能和进阶技巧,让你的 Vite 应用秒变原生 App!
萌萌哒草头将军
2025/04/28
4910
2025 年了,我不允许你还不知道 vite-plugin-pwa
推荐阅读
相关推荐
带你走进PWA在业务中的实践方案
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档