《PWA实战:面向下一代的Progressive Web APP》读书笔记

前言

之前自己根据网上的教程学习写了几个PWA的小Demo,觉得PWA很有意思,想要更多的了解一下PWA,所以读了这本书。这本书是MANNIN出版社出的,所以书里的代码都有非常棒的注释,因此这篇笔记不会展开讲代码,而是着重于描述PWA的功能以及常见的问题和解决方法。

  • 图书资源
  • 图书中代码的Github仓库

1. 什么是PWA

简单来说,PWA是一系列新兴技术的统称,这些技术旨在增强web app的功能,使其能够在用户体验上媲美原生应用。PWA的功能包括:

  • 响应性:可以适配更小的屏幕
  • 连接独立性:因为service worker的缓存,它使网页可以离线工作
  • 类似原生应用的交互性:使用应用程序外壳架构(app shell)来构建
  • 安全性:基于HTTPS协议
  • 可发现性:搜索引擎能够发现它(SEO好)
  • 可安装性:可以添加到桌面像原生应用一样启动(基于manifest技术)
  • 可链接性:可以很容易的通过URL进行分享

1.1 网站性能测试工具

  • Lighthouse
  • webpagetest

Lighthouse会生成性能测试报告,但是测试结果会受网络质量的影响。webpagetest是真机测试,但是测试可选地点和浏览器是有限的,有时候还要排队等待。但不管怎样,这些测试工具可以辅助我们测试自己的站点,让我们了解到自己站点现在存在的性能问题,然后着手改善,相信PWA技术会让你的改善变得更加简单快捷,而且效果显著。最最重要的是,PWA是渐进增强的,不需要重写已经存在的代码!!

2. PWA的主要技术

2.1 Service Worker

2.1.1 service worker的功能

简单来说,service worker可以拦截请求(fetch request),可以给出响应(response)。你可以对拦截下来的请求做处理,比如说你发现缓存中已经有了请求的资源,而且资源还在有效期内,你就可以直接从缓存中读取资源终止请求。如果在service worker的安装阶段就缓存好了一些资源,这样再次访问时可以直接从缓存中加载部分资源,页面加载速度会大幅度提升。即使是离线访问页面也可以给出之前缓存好的信息,极大的提升了用户的体验感。可以使用Google的工具库Workbox写service worker文件,里面提供了很多易用的API以及各种缓存策略。

2.1.2 service worker的特点

  • 基于HTTPS协议
  • 运行在自己的全局脚本上下文中
  • 不是绑定到一个特定的web页面
  • 无法修改web页面中的元素,无法访问DOM
  • 每次对service worker文件进行任何更改时,它都会自动触发service worker更新流。

2.1.3 service worker的调试

可以通过Google的开发者工具Application里面的Service Workers进行调试。

2.1.4 service worker常见问题

1) 缓存更新问题

方法1】:因为修改service worker文件会触发service worker的更新流,所以想要更新缓存时,可以修改缓存名(cacheName),例如将helloWorld改成helloWorld-2

方法2】:Cache busting技术(作者更推荐),给文件打上版本号,例如:

<script type="text/javascript" src=“/js/main-xtvbas65.js"></script>
复制代码

这种技术被称为缓存总线技术,已经出现了很多年。当一个静态文件被缓存时,它可以被存储很长一段时间,直至到期。如果你更新了一个网站,但由于文件的缓存版本存储在访问者的浏览器中,他们可能看不到所做的更改。缓存总线通过使用唯一的文件版本标识符告诉浏览器文件的新版本是可用的。

2) 拦截请求时怎么忽略查询字符串参数
caches.match(event.request, { ignoreSearch: true })
复制代码

2.2 Manifest

2.2.1 manifest的功能

让web app可以像原生应用一样添加图标到桌面,然后通过桌面图标启动。可配置图标,启动动画等,详细配置见文档。

2.2.2 manifest的调试

可以通过Google的开发者工具Application里面的Manifest进行调试。

2.2.3 manifest常见问题

1) 怎么让添加到主屏幕的横幅显示出来

要让添加到主屏幕的横幅显示出来,必修满足以下条件:

  • 需要 manifest.json文件。
  • 需要一个启动的URL
  • 需要 144 x 144 的PNG图标
  • 网站必须基于HTTPS协议,并且使用Service Worker
  • 用户必须访问了网站至少两次, 每次至少有五分钟

2.3 Push notifications

2.3.1 Push notifications的功能

即使用户不打开浏览器也可以接收到消息,原生的API写起来有一些麻烦,可以借助第三方的工具库来写,例如OneSignal, Aimtell等。

2.4 Synchronous data

Background sync是Google新推出的Web API,可延迟用户行为,直到用户网络连接稳定。这样有助于保证用户想要发送的数据就是实际发送的数据。

PeriodicSync还在开发中,它可以实现定期同步。

3. 用PWA提升用户体验的例子

3.1 假wifi和单点故障问题

如下面的代码所示可以设置超时时间,用Promise的race函数让超时函数和正常的请求竞跑,如果到超时时间请求还未得到相应则抛出超时错误,这样可以及时让用户了解到出现了网络故障。

function timeout(delay) {return new Promise(function(resolve, reject) = >{setTimeout(function() {resolve(new Response('', {status: 408,statusText: 'Request timed out.'}));},delay);});
};self.addEventListener('fetch', function(event) {if (/googleapis/.test(event.request.url)) {event.respondWith(Promise.race([timeout(3000), fetch(event.request.url)]));} else {event.respondWith(fetch(event.request));}
});
复制代码

上面的代码看上去有一点繁琐,我们可以借助Google的工具库Workbox来简化以上代码

importScripts('workbox-sw.prod.v1.1.0.js');
const workboxSW = new self.WorkboxSW();
workboxSW.router.registerRoute('https://fonts.googleapis.com/(.*)', workboxSW.strategies.cacheFirst({cacheName: 'googleapis',networkTimeoutSeconds: 3
}));
复制代码

4. PWA的未来

4.1 Streaming data

Streaming data可以实现流数据的传输。举个例子,如果后台传递了一个很大的数据到前台,正常情况下前台需要接受完这个数据才能进行展示,而流数据可以一边接受一边展示,不需要等到整个数据都接受完再展示。

4.2 Web Bluetooth

Web Bluetooth可以在浏览器中连接蓝牙设备并通过PWA与设备交互。例如,开发人员已经开发出可以与心率监视器交互的网络健身应用程序和可以驾驶微型无人机的网络应用程序。

4.3 The Web Share API

The Web Share API允许您轻松触发原生Android共享对话框,通过URL或文本进行共享。这是一个重要的API,因为它为终端用户提供了对数据共享方式和位置的控制。

4.4 Payment Request API

Web Payments是W3C正在开发的一种新兴网络标准,旨在简化在线支付,并使更多的参与者能够轻松参与网络上的支付生态系统。标准灵活; 它们适用于各种类型的支付系统,适用于任何设备,支付方式或支付服务提供商的任何浏览器。这种灵活性使开发简单性,部署一致性以及与新兴支付技术的未来兼容性。

4.5 Hardware: the Shape Detection API

Shape Detection API允许开发人员访问人脸检测等功能,条形码检测,甚至是文本检测。


结语

看完这本书,特别是PWA未来发展这一块的内容,深深的感觉到web日新月异的发展以及逐渐强大的功能API,期待各种新功能的完善,期待可以在项目中用起来!开心到飞起,越来越坚信转行前端的决定是正确的:)

转载于:https://juejin.im/post/5c9d91c35188251e592be8b7

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

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

相关文章

2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换

为什么要使用进制数 数据在计算机中的表示&#xff0c;最终以二进制的形式存在 , 就是各种 <黑客帝国>电影中那些 0101010… 的数字 ; 我们操作计算机 , 实际 就是 使用 程序 和 软件 在 计算机上 各种读写数据, 如果我们直接操作二进制的话 , 面对这么长的数进行思考或…

如何战胜浮躁

浮躁是当下年轻人的通病&#xff0c;因为各种压力或心智不够成熟等原因&#xff0c;导致在生活工作当中经常处于一种情绪无法自如控制的状态。这种浮躁的状态不仅影响到正常的工作生活&#xff0c;长时间的话还会影响到身体健康。本篇就来分享一些如何战胜浮躁的方法&#xff0…

wireshark的使用方法(转)

https://www.cr173.com/html/20128_all.html

python脚本调用外部程序的若干种方式以及利弊

脚本执行外部程序的常用几种方式&#xff1a; # os.popen(path)# subprocess.run(cmd,shellTrue)# subprocess.check_call(cmd,shell True)# os.system(command)# win32api.ShellExecute(0, open, path, , , 0) os.popen(path) 和 os.system(command) 这两种执行的效果是差不多…

解决: Your ApplicationContext is unlikely to start due to a @ComponentScan of the default

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 用 springboot 搭一个小应用 报错&#xff1a; Your ApplicationContext is unlikely to start due to a ComponentScan of the defaul…

藏经阁计划发布一年,阿里知识引擎有哪些技术突破?

为什么80%的码农都做不了架构师&#xff1f;>>> 阿里妹导读&#xff1a;2018年4月阿里巴巴业务平台事业部——知识图谱团队联合清华大学、浙江大学、中科院自动化所、中科院软件所、苏州大学等五家机构&#xff0c;联合发布藏经阁&#xff08;知识引擎&#xff09;…

45度做人 90度做事 180度为人 360度处事

面对社会复杂的关系和瞬时而变的人情世故&#xff0c;许多人会感叹活得太累。其实&#xff0c;只要我们保持平和的心态&#xff0c;不去计较人生的成败&#xff0c;始终保持一颗感恩的心&#xff0c;同样可以活得轻松自在&#xff0c;活出人生的精彩!以度量人的处事原则&#x…

SDK 和 API 的区别是什么

SDK 就是 Software Development Kit 的缩写&#xff0c;翻译过来——软件开发工具包。这是一个覆盖面相当广泛的名词&#xff0c;可以这么说&#xff1a;辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做SDK。SDK被开发出来是为了减少程序员工作量的。比如——有公司…

解决413 Request Entity Too Large

解决413 Request Entity Too Large 修改nginx配置 这是最简单的一个做法&#xff0c;着报错原因是nginx不允许上传配置过大的文件&#xff0c;那么件把nginx的上传大小配置调高就好。1、打开nginx主配置文件nginx.conf&#xff0c;一般在/usr/local/nginx/conf/nginx.conf这个位…

解决 springboot 启动报错 -- Cannot determine embedded database driver class for database type NONE

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 问题描述 我只是新建一个全新的 springboot 工程&#xff0c;什么都没有写的情况下启动报错如题&#xff1a; Cannot determine em…

Luogu P3731 [HAOI2017]新型城市化

题目显然可以转化为求每一条边对二分图最大独立集的贡献&#xff0c;二分图最大独立集\(\)点数\(-\)最大匹配数&#xff0c;我们就有了\(50pts\)做法。 正解的做法是在原图上跑\(Tarjan\)&#xff0c;最开始我想复杂了&#xff0c;后来才意识到&#xff0c;只要存在这样一个强连…

【数据结构算法】快排/归并/堆排序 c++

一个用来了解数据结构算法&#xff08;各种排序&#xff0c;列表&#xff0c;树等&#xff09;很友好的网站&#xff1a; https://visualgo.net/en 该题目来自于牛客&#xff1a;算法篇-排序问题 快排&#xff08;必备&#xff09;归并&#xff08;体会分治&#xff09;堆(自…

人生的八种投资

1、最心甘情愿的投资&#xff1a;儿女 投资大师罗杰斯一生成功无数&#xff0c;问及他最得意的一次投资时&#xff0c;他说&#xff0c;是自己的女儿。“我曾经觉得养孩子是既麻烦又浪费钱的事情&#xff0c;有了女儿才知道&#xff0c;这才是最能给你带来幸福感的投资。” …

Linux操作系统load average过高,kworker占用较多cpu

Linux操作系统load average过高&#xff0c;kworker占用较多cpu 今天巡检发现&#xff0c;mc1的K8S服务器集群有些异常&#xff0c;负载不太均衡。其中10.2.75.32-34&#xff0c;49的load average值都在40以上&#xff0c;虽然机器的cpu核数都是40或48核不算严重&#xff0c;但…

[flask]gunicorn配置文件

配置文件 #!/home/xx/.virtualenvs/xx/bin/python # encoding: utf-8import multiprocessing# 监听端口 bind 0.0.0.0:5000 # 工作模式 worker_class gevent # 并行工作进程数 workers multiprocessing.cpu_count() * 1 # 设置守护进程 daemon True# 设置日志记录水平 logl…

Linux 上 docker 安装 oracle-xe-11g

环境&#xff1a; 2G 内存&#xff0c;60G 硬盘阿里云一台&#xff08;带宽 1M&#xff09;, 配置如下图&#xff1a; 软件&#xff1a;docker Docker version 1.6.2, build 7c8fca2 相关 link docker 镜像站&#xff1a;https://store.docker.com 视频教程&#xff1a;ht…

最易忽视的肾虚4件事

肾是人的“先天之本”&#xff0c;如果把人体比喻成一棵大树&#xff0c;肾就是树根&#xff0c;吸收、传递营养充足&#xff0c;大树才能枝繁叶茂。肾虚了&#xff0c;可能引起各种健康问题。 然而&#xff0c;在现实中&#xff0c;人们常常会夸大肾虚&#xff0c;很多人把出…

【计算机网络】wireshark数据流追踪、图像抓取(转)

不废话了直接上地址 https://www.cnblogs.com/grj001/p/12223954.html

stm32学习方法

很多新手都问过嵌入式系统学习方法&#xff0c;好的学习方法可以事半功倍&#xff0c;学习嵌入式系统&#xff0c;掌握了好的学习方法&#xff0c;自然可以水到渠成。创客学院的老师就通过本篇文章就来说说嵌入式系统学习方法&#xff0c;新手必看 第一&#xff0c;学习基本的裸…

知识点漏缺总结

模块化 使用模块化可以给我们带来以下好处 解决命名冲突 提供复用性 提高代码可维护性 Proxy Proxy 来替换原本的 Object.defineProperty 来实现数据响应式。 Proxy 是 ES6 中新增的功能&#xff0c;它可以用来自定义对象中的操作。 let p new Proxy(target, handler) 复制代码…