PWA(Progressive Web App)入门系列:Sync 后台同步

前言

当我们在一些地下停车场,或者在火车上、电梯等无法避免的信号不稳定的场所,使用网站应用处理一些表单操作或者上传数据的操作时,面临的将是网络连接错误的响应,使用户的操作白费。

而此刻 PWA 的 Sync API 就很好的解决了这个问题,让用户处理一些数据上传的操作时,无需关系网络环境,所有相关操作均会完成。Sync API 也是 PWA 离线里面的重要一环,下面就说一块。


SyncManager API

SyncManager 接口提供了用于注册和获取 Sync 注册的接口。Sync 是一个简单且非常实用的功能。

通过 ServiceWorkerRegistration 接口的 sync 进行获取:

navigator.serviceWorker.ready.then(reg => {console.log(reg.sync)
})

方法

SyncManager.register

用于注册一个 sync tag,tag 按照自己的需求设置。

语法:

SyncManager.register(DOMString tag).then(function(void) { ... })

返回 void 的 Promise。

SyncManager.getTags

用于获取已注册且未完成的 sync tag(完成后的 sync tag 会自动从此列表中删除)。

语法:

SyncManager.getTags().then(function(tags[]) { ... })

返回注册 syn tag 的字符串数组的 Promise。

事件

onsync

注册后的 Sync tag 会触发 ServiceWorkerGlobalScope 下的 onsync 事件。

此事件值包含两个属性:

  • tag:返回触发此次事件的注册 Sync tag 的 tag 值。
  • lastChance:如果浏览器在尝试多次后还未成功,当 lastChance 为 true 时表示不再尝试,且此次 sync tag 删除。

流程

从注册一个 Sync tag 到这个 Sync tag 完成,会经历三个阶段:

  • Registered sync:注册 sync。
  • Dispatched sync event:发出 sync 事件。
  • Sync completed:Sync 完成。

SyncManager.register(tag) 后,会立即注册 sync,并将注册后的 sync tag 放入 sync 的注册列表中(可以通过SyncManager.getTags() 获取到),然后会判断当前的网络环境,只有网络在线的情况下,注册的 Sync 才会发出 sync 事件,然后当 SyncEvent.waitUntil() 中 Promise 为 reject 时将会周期性的触发 onsync 事件,直到不为 reject 才会完成 Sync tag,然后将相关 tag 清除。

在 Chrome 下,当 SyncEvent.waitUntil() 中的参数值一直为 Promise reject 时,会最多触发三次 onsync 事件,每次的周期时间至少为 5 分钟。

注意:sync 事件中的处理结果必须放在 SyncEvent.waitUntil() 中,否则会立即完成 Sync。

注意:上图中的重试次数和周期时间是 Chrome 环境下的体现,具体次数和周期标准中未规范,可以 e.lastChance 来判读,处理最后一次的相关逻辑。

可以通过 DevTools 里的 Background Services 查看 Sync 的执行过程:


使用场景

SyncManager 本身只是一个简单的 API,sync 事件中也只有两个只读属性,所以基于 Sync 来做的同步数据,比较好的方式搭配 IndexDB 来实现,下面两个场景也是基于 IndexDB。

1. 完全 Sync 化数据请求传输

这种场景下,相关场景的数据请求先写入 IndexDB 中,然后注册 Sync,在 onsync 中根据相关 tag 来处理 IndexDB 中的数据请求。

下面是一个聊天应用的场景

index.html:

btnSend.addEventListener('click', async () => {await db.add('chatList', { msg, time, useId});reg = await navigator.serviceWorker.ready;reg.sync.register('send_chat');
})

sw.js

self.addEventListener('sync', e => {e.tag == 'send_chat' && e.waitUntil(new Promise.then(async (res, rej) => {var allData = await db.getAll('chatList');return Promise.all(allData.map(data => fetch(data)));}))
})

2. 失败请求的 Sync 化

这个场景可以针对于某些特定请求,先让它正常发送网络请求,如果失败则将失败的请求放到相关的 IndexDB 中,并设定这条网络请求可尝试的有效期,有效期内均会重拾。

关于 sync 的周期上面也说过,在 Chrome 下最多尝试三次,本场景下的这种需求,需要相关的 sync tag 一直处理可用状态,所以需要对这一层进行修改满足需求。

例如点赞场景

index.html

btnLike.addEventListener('click',  () => {reg = await navigator.serviceWorker.ready;reg.sync.register('like’);fetch(data).catch(e => {db.add('likeList', {data, lastTime: 12938749138});  // 有效期时间戳})
})

sw.js

self.addEventListener("sync", e => {if (e.tag == "send_chat") {e.waitUntil(new Promise.then(async (res, rej) => {while (db.get("likeList")[0]) {var data = db.get("likeList")[0];try {if(data.lastTime > Date.now()) {db.remove('likeList', data)} else {await fetch(data);db.remove('likeList', data)}            } catch (err) {if(e.lastChance == true) { // 如果最后一次尝试机会,则重新注册,保证一直有效self.registration.sync.register('like')}}}}));}
});

注意:上面代码中的 db 为模拟的伪代码。


通过 Sync API 的支持,网站应用可以较大的离线化,提升用户的体验度和应用的可靠性。这样用户在网络连接失败的情况下也能上传表单、点赞评论文章、发送消息等等,为用户带来积极的影响。也意味着 Web 应用更加接近原生应用的体验效果。


博客名称:王乐平博客

CSDN博客地址:http://blog.csdn.net/lecepin

知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PWA(Progressive Web App)入门系列:安装 Web 应用

前言 在传统的 Web 应用中,通常只能通过在浏览器的地址栏里输入相应的网址才能进行访问,或者把网页地址创建到桌面上通过点击,然后在浏览器里打开。 传统模式下,图标、启动画面、主题色、视图模式、屏幕方向等等都无法去自定义和…

「工具」IndexDB 版备忘录

前言 工作日常需要做一些备忘录,记录一些要做的事。在 Mac 上有使用系统的备忘录,但功能偏弱且文本格式调整不方便。再就是使用浏览器找专门的备忘录网站,功能是满足了,但是链路长,没有桌面软件直接。 所以最后干脆自…

「工具」PWA Manifest图标及 favicon.ico 生成工具

PWA 其中有一个能力就是把网站安装到系统桌面,以原生应用的体验来运行网站,使用户无需再找开浏览器输入网址进入网站,而是可以直接点击安装好的应用直接运行,给使网站访问缩短路径及增加网站的曝光度。 其中有一个问题就是需要生…

各种浏览器缓存浅析

前言 目前浏览器的缓存类型众多,HTTP Cache、Disk Cache、Memory Cache、ServiceWorker Cache、Push Cache 等等,这些缓存是如何产生的?命中优先级是怎么样?又该如何去使用它们? Disk Cache、Memory Cache Disk Cac…

[工具]TS 视频合并工具

简介 当下载 m3u8 资源时,通常产生的是多个 ts 视频文件,所以需要借助某些工具来将这些 ts 视频片段整合为一个视频文件。 本软件主要解决的就是这个问题,底层基于ffmpeg,可正常运行在 Windows 和 Mac 平台。不仅可以合并 ts 为单…

[会议分享]2020全球软件大会分享-PWA在项目中的最佳实践

大会地址:https://www.bagevent.com/event/1233659# PPT下载:https://download.csdn.net/download/lecepin/12871373

「浏览器插件」非常好用的JSON-View

Chrome 商店:地址 下载地址:地址 Github:https://github.com/lecepin/lp-json-view 查看/格式化 二合一。 功能 自动识别 JSON 内容,并在页面右下角创建切换按钮。支持展开/折叠节点。支持全部展开、全部折叠、展开一二三层节点…

Github Action 快速构建 Electron 应用

前言 在开发 Electron 应用时,比较耗时的部分应该是构建打包的过程,像用 electron-builder 这种打包工具来说,它会根据你要打包的系统来下载应用的系统镜像打包工具,由于这些镜像的源文件托管在 Github 上,且 nodejs …

「浏览器插件」网址小尾巴终结者

前言 在我们日常的开发调试中,会在 URL 上添加一些特殊的小尾巴 用来显示调试界面或者开启一些特殊功能,当你接触了越来越多的系统后,你需要使用的小尾巴就变得越来越多,记忆和使用成本非常大,以及含有小尾巴的网址 在…

什么是低代码?

低代码 是一种软件开发方法,可以减少手工编码的过程,尽可能快的交付应用程序。 低代码平台 是工具的合集,这些工具可以通过建模和图形界面来进行应用程序的可视化开发。低代码使开发人员可以跳过手工编码,从而加快了应用程序的开…

什么是 LOW-CODE ?

低代码平台的特征 可视化建模工具 使用可视化方法和模型创建应用程序比使用代码进行开发要快。具有可视化建模功能的低代码平台,使用内置的组件,以任何人都可读的形式表示任何信息,从没有技术技能的常规企业用户到专业开发人员。 开箱即用…

简简单单 上传下载

背景 我们经常会有手机向电脑传文件 或者 电脑像手机传文件的需求。 而通常的解决方案是:手机上安装一个聊天软件(如微信),电脑上安装一个聊天软件,然后自己给自己传输,然后进行下载。 这种方式是很麻烦的…

「VSCode插件」提效工具 - 快捷面板

前言 做为一个开发人员,在日常的开发过程中,经常会在 Terminal 中输入各种命令,如:npm i、npm start、git init、rm -rf、node_modules 等命令,看似方便,实则高频率的输入很烦人。那有什么方法可以把这些高…

VSCode摸鱼插件 — FreeWindow

背景 在一些不是很忙的时候,想高效利用下时间,看看书丰富一下自己,但是大庭广众下长时间看一本实体书,或者看手机的电子书,或者在电脑上看网页书都不太合适,显得自己很闲的样子,那该如何看起来…

在线生成文本图片 CFC函数计算版

百度云函数计算 CFC 运行环境。 使用 sharp 图处理(文档)。 使用 图片参数: widthheightrgba 文本参数: textfColorfSizefTopfLeft {HTTP触发器地址}?width1000&height300&fSize120&fColor%23d9333f&text奥利…

调试利器:浏览器 Logger

1. 前言 在一些业务系统中,由于集成的平台产物或工具较多,而这些产物的 log 不收敛,很多时候打开控制台就是满屏的 log,自己的 log 需要在满屏的 log 中查找,或者在 log 上加一些前缀用 Filter 去过滤,严重…

主动型页面性能利器:Page Status

1. 背景 当页面出现性能问题,如加载慢、页面卡顿等现象时,大多是用户主观上的感受。而要真正客观的去评测性能和定位问题原因,通常需要专业的前端同学通过 DevTools 中的 Performance 等工具来查看(如图 1 所示)&…

前端状态机:XState 首个中文文档上线了

XState 做为一个非常好用的前端状态机库,但官网文档却只有英文版,为了阅读体验,我这里翻译了中文版。 仓库地址:https://github.com/lecepin/xstate-docs-cn文档地址:https://lecepin.github.io/xstate-docs-cn/zh 由…

降低前端业务复杂度新视角:状态机范式

无论做业务需求还是做平台需求的同学,随着需求的不断迭代,通常都会出现逻辑复杂、状态混乱的现象,维护和新增功能的成本也变的十分巨大,苦不堪言。下图用需求、业务代码、测试代码做对比: 图中分了 3 个阶段&#xff1…

Mac 摸鱼神器

这是一个 Mac 系统的摸鱼应用,仿真了大多数的 Mac 系统黑屏故障。开启摸鱼功能后,可以给自己一段休息的时间~ 软件使用 Electron 开发,源码(欢迎 Star ⭐ ):https://github.com/lecepin/mac-fish 1. 主界…