PWA学习心得

一、什么是PWA

Progressive  Web  App , (渐进式增强 WEB 应用) 简称 PWA ,是提升WebApp的体验的一种新方法,能给用户原生应用的体验。

PWA 本质上是 Web App ,借助一些新技术也具备了Native App的一些特性,兼具 Web App和Native App的优点。

1.1  PWA 的 主要特点

 可靠        ( Reliable ) - 即使在不稳定的网络环境下,也能瞬间加载并展现

 快     ( Fast ) - 快速响应,并且 动画平滑流畅

 有 粘性   ( Engaging ) - 用户可以添加到桌面和接收通知

【 沉浸式的用户体验 】

 沉浸式特点是只显示内容区域,没有状态栏,导航栏,工具栏等

 沉浸式是针对实用型和效率型而言

 优点是可以让用户停留时间较长,用户体验比较轻松,更好的促进转化

1.2  PWA 的 主要 技术 点

 离线可用     ( Service Worker )

 主屏图标     ( App Manifest )

 通知       ( Push API & Notification API )

1.3  PWA 的 DEMO

天气PWA https://weatherpwa.baidu.com/

可以在移动设备上的 Chrome 浏览器 (version > 52) 访问

1.3.1 有网络的情况下,在 谷歌浏览器打开页面效果

  

  

1.3. 2 有网络的情况下 ,点击屏幕上新生成的 天气 APP图标 打开页面显示效果

这里可以看到打开的页面中 只显示内容区域 , 没有状态栏,导航栏,工具栏 等

1.3.3 无网络的情况下,在QQ浏览器打开 https://weatherpwa.baidu.com/

1.3.4 无网络的情况下,在谷歌浏览器打开 https://weatherpwa.baidu.com/

下拉刷新,会提示【 设备离线,加载历史数据 】

1.3.5 无网络的情况下 ,点击屏幕上生成的天气 APP图标

下拉刷新,会提示【 设备离线,加载历史数据 】

 参考资料

  1. Progressive Web Apps
  2. 什么是PWA

二、什么是 Service Worker 官网介绍

   它是一种 Web Worker

   它是一个外链的js文件,如 /sw.js

   它是一种特殊的Web Worker,能够拦截网络请求

   它只能运行在HTTPS协议上

   它还能接受推送消息和 处理后台同步

   它 一但被注册就永远存在,除非显示unregister

   它 是 PWA 的核心

什么是Web Worker?

当在HTML页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。

web
worker  是运行在后台的JavaScript,独立于其他脚本,不会影响页面的性能
。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时
web  worker在后台运行
.

浏览器一般有三类 web
Worker

Dedicated
Worker
:专用的worker,只能被创建它的
JS
访问,创建它的页面关闭,它的生命周期就结束了。

Shared  Worker
:共享的
worker,可以被同一域名下的JS访问,关联的页面都关闭时,它的生命周期就结束了。

Service Worker
:是事件驱动的
worker,生命周期与页面无关,关联页面未关闭时,它也可以退出,没有关联页面时,它也可以启动,

2.1
Service
 Worker
如何工作

2.2
Service
 Worker
兼容性

单击可以查看详情

2.3
Service
 Worker
生命周期

生命周期分为这么几个状态


安装中
  (
installing
 
)


安装
后  (
installed
)


激活
中      (
activating
)


激活后   (
activated
)


废弃   (
redundant
)

安装 ( installing  )

这个状态发生在 Service Worker 注册之后,表示开始安装,触发 install 事件回调指定一些静态资源进行离线缓存。

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 线程被激活。

activate 回调中有两个方法:

event.waitUntil()
:传入一个 Promise 为参数,等到该 Promise 为 resolve 状态为止。

self.clients.claim()
:在 activate 事件回调中执行该方法表示取得页面的控制权, 这样之后打开页面都会使用版本更新的缓存。旧的 Service Worker 脚本不再控制着页面,之后会被停止。

激活后(
activated
)

在这个状态会处理 activate 事件回调 (提供了更新缓存策略的机会)。并可以处理功能性的事件
fetch
(请求)、
sync
(后台同步)、
push
(推送)。

废弃状态
 
(
redundant
)

这个状态表示一个 Service Worker 的生命周期结束。

这里特别说明一下,进入废弃 (redundant) 状态的原因可能为这几种:

安装 (install) 失败

激活 (activating) 失败

新版本的 Service Worker 替换了它并成为激活状态

2.4
Service
 
Worker
注册

//index.html

if 
(
'serviceWorker'
in
navigator
) {

navigator
.serviceWorker.register(
'/service-worker.js'
)

    .
then
(
function
(reg)  {

console
.
log
(
'Service Worker registered'
,
reg)
;

})

    .catch(
function 
(error)  {

console
.
error
(
'Error registering  Service  Worker'
,
error)
;

})
;

}

查看是否注册成功

可以在 PC 上chrome 浏览器, 输入
chrome://inspect/#service-workers

2.5
Service
 Worker
安装

//
service-worker.js

self
.
addEventListener
(
'install'

function
(event)  {

return
self
.skipWaiting()
;

})
;

2.6

Service  Worker
调试

借助 Chrome 浏览器 debug

使用 Chrome 浏览器,可以通过进入控制台 Application -> Service Workers 面板查看和调试。如下图所示:

查看 Service Worker 缓存内容

Service Worker 使用 Cache API 缓存只读资源,可以在 Chrome DevTools 上查看缓存的资源列表。

网络跟踪

经过 Service Worker 的 fetch 请求 Chrome 都会在 Chrome DevTools Network 标签页里标注出来,其中:

来自 Service Worker 的内容会在 Size 字段中标注为 from ServiceWorker

Service Worker
发出的请求会在
Name
字段中添加
‘齿轮’
图标。

安卓真机 debug

2.7
其它
详细API

其它
详细API可以参考【参考资料】中的

 参考资料

1.
Service Wor
k
e
r
s Nigh
t
l
y

2.

页面守护者:Service

Worker

3.
PWA,准备好了吗?

4.

PWA兼容性

5.

如何进行 Service Worker 调试

6.

网站渐进式增强体验(PWA)改造:Service Worker 应用详解

三、
APP Manifest 与添加到主屏幕

允许将站点添加至主屏幕,是 PWA 提供的一项重要功能

3.1定义 manifest.json 配置添加到主屏幕功能

创建 manifest.json 文件,并将它放到你的站点目录中

在所有页面引入该文件

可以在 Service Worker 中监听 beforeinstallprompt
事件做一些应用内的行为处理

在页面 head 区域添加如下内容:

<
link rel=
"manifest"
href=
"manifest.json"
/>

manifest.json

{

"name"
:
"Minimal PWA"
,

"short_name"
:
"PWA Demo"
,

"display"
:
"standalone"
,

"start_url"
:
"/"
,

"theme_color"
:
"#313131"
,

"background_color"
:
"#313131"
,

"icons"
:
[

    {

"src"
:
"e.png"
,

"sizes"
:
"256x256"
,

"type"
:
"image/png"

}

  ]

}

在这个manifest.json文件中,我们可以轻松得到这个PWA的信息:

name
:定义此PWA的名称。

icons
:定义一系列的图标以适应不同型号的设备。

theme_color
:主题颜色(影响手机状态栏颜色)。

background_color
:背景颜色。

start_url
:启动地址。由于PWA实际上是一个web页面,所以需要定义PWA
在启动时应该访问哪个地址。

display
:“standalone”表示其以类似原生APP的全屏方式启动。

添加主屏幕效果

  

3.2设置 IOS Safari 上的添加至主屏幕元素

应用图标:

<
link rel=
"apple-touch-icon"
href=
“apple-touch-icon.png"
>

启动画面:

<
link rel=
"apple-touch-startup-image"
href=
"launch.png"
>

应用名称:

<
meta name=
"apple-mobile-web-app-title"
content=
"Todo-PWA"
>

全屏效果:

<
meta name=
"apple-mobile-web-app-capable"
content=
"yes"
>

设置状态栏颜色:

<
meta name=
"apple-mobile-web-app-status-bar-style"
content=
"#fff"
>

3.3
设置window10贴片图标

<
meta name=
"msapplication-TileImage"
content=
"images/logo/144x144.png"
>

<
meta name=
"msapplication-TileColor"
content=
"#2F3BA2"
>

3.4在线生成
manifest.json
文件

https://app-mani
f
est.firebaseapp.com/

https://tomitm.github.io/appmanifest/

https://brucelawson.github.io/manifest/

在定义好
manifest.json
文件后,我们可以通过Chrome的开发者工具看到详细的内容:

 参考资料

1.

Web App Manifest

2.

manifest.json 简介

四、
App Shell

App Shell,顾名思义,就是“壳”的意思,也可以理解为“
骨架屏
”,说白了就是在内容尚未加载完全的时候,优先展示页面的结构、占位图、主题和背景颜色等,它们都是一些被强缓存的html,css和javascript。

要用好App Shell,就必须保证这部分的资源被Service Worker缓存起来。我们在组织代码的时候,可以优先完成App Shell的部分,然后把这部分代码分别打包构建出来。

4.1
优势

始终快速的可靠性能

如同本机一样的交互

数据的经济使用

 参考资料

1.
App Shell 模型

五、
使用Offine-Plugin把网站升级成
PWA

 参考资料

1.
offline-plugin

2.
offline-plugin DEMO

3.
使用offline-plugin搭配webpack轻松实现PWA

六、
与PWA相关的开源框架

6.1

Lavas

基于 Vue 的 PWA 解决方案,帮助开发者快速搭建 PWA 应用,解决接入 PWA 的各种问题

 参考资料

1.

Lavas

2.
Lavas
GitHub

PWA学习心得的更多相关文章

  1. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  2. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  3. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  6. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  7. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  8. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  9. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. Project 9:两种简单数列排序

    1.冒泡法排序 /* 冒泡排序法的核心思想就是依次把最大的数换到最后面. 若有n个数 就需要通过n-1次循环来排序. 具体做法就是从第一个数开始 两个数比较大小大的换到后面,这样最大的就在最后了. 然 ...

  2. Project 6:上楼梯问题

    问题简述:梯有N阶,上楼可以一步上一阶,也可以一步上二阶.编写一个程序,计算共有多少中不同的走法. 样例输入: 5 样例输出: 8 #include <stdio.h> int count ...

  3. URL.createObjectURL() 与 URL.revokeObjectURL()

    .URL.createObjectURL URL.createObjectURL()方法会根据传入的参数创建一个指向该参数对象的URL. 这个URL的生命仅存在于它被创建的这个文档里. 新的对象URL ...

  4. JAVA基础第九组(5道题)

    41.[程序41] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一       个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...

  5. Swing-JCheckBox用法-入门

    JCheckBox是Swing中的复选框.所谓复选框就是指,可以同时存在多个这样的控件,它们可以有多个处于被选中状态.对于每一个复选框而言,它只有选中和未选中两种状态. JCheckBox的常用方法如 ...

  6. Swing-布局管理器应用--WIN7上计算器的UI实现

    学完了Swing布局管理器,为了加深理解我决定做一些UI的实现,那就从WIN7上的计算器开始吧!首先,我们来研究一下它的UI.该计算器的UI主要有3个,分别是标准型.科学型和程序员型,如下图所示.   ...

  7. sudoku--设想

    在查阅了一些资料和自己动手写一写后,找到一种可行的解法. 第一步 首先将9x9的数独方格分成九份3x3的九宫格,如下图 B1 B2 B3 B4 B5 B6 B7 B8 B9 而后在左上角的B1上随机生 ...

  8. 201521123044 《Java程序设计》第5周学习总结

    1. 本章学习总结 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 答: ...

  9. 201521123015 《JAVA程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业:本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  10. Bootstrap栅格系统用法--Bootstrap基础

    1.栅格系统实现布局的原理 1)Bootstrap把屏幕的宽度拆分成12格(列),每一格像素的多少由设备屏幕分辨率决定,我们在开发项目的过程中不需要去指定像素或者百分比. 2)不同范围的分辨率对应不同 ...