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. 常用按钮css

    #openwx_btn {                                 border: 0px;                background-color: rgb(145, ...

  2. 个人作业2-英语学习案例app分析

    第一部分 调研, 评测 (软件的bug,功能评测,黑箱测试, 第8章 用户调研, 12 章 软件的用户体验) 下载并使用,描述最简单直观的个人第一次上手体验. ①个人感觉还不错,词典的首页页面挺好看的 ...

  3. 团队作业8——第二次项目冲刺(Beta阶段)Day5--5.23

    1.提供当天站立式会议照片一张 2.会议内容 讨论已完成的功能 对于界面,谈谈各自的看法 商定测试计划 用户需求进一步调研 3.工作安排 队员 今日任务 明日任务 贡献比 林燕 测试运行效果 根据测试 ...

  4. JTable用法-实例

    前几篇文章介绍了JTable的基本用法,本文实现一个简单的JTable,算是前文的一个总结,并造福供拷贝党们. Swing-JTable用法-入门 Swing-JTable的渲染器与编辑器使用demo ...

  5. 2015级软工实践k班第一次作业-准备

    第一次作业-准备······ 几篇文章阅读下来发现一个事实,还是要有明确的目标,清楚自己需要做什么最为重要.然后根据目标确定需要为之所做的准备工作,考研也好,工作也罢,都是服务于自己的目标. 问题答应 ...

  6. Java学习6——基本数据类型及其转换

    Java常量: Java的常量值用字符串表示,区分不同的数据类型 整型常量123.浮点型常量3.14.字符常量'a'.逻辑常量true.字符串常量"helloworld". ps: ...

  7. Linux下安装oracle jdk

    从官网下载对应的 .tar.gz压缩文件. 在linux某个目录下解压 到根目录下的etc文件夹下编辑profile文件,在文件的末尾加上 JAVA_HOME=/usr/local/jdk1.8.0_ ...

  8. 201521123087 《Java程序设计》第6周学习总结

    1. 本周学习总结 2. 书面作业 clone方法1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?                 ...

  9. 201521123110第二周Java学习总结

    1.本章学习总结 本周的Java学习相对前一周更进了一步,初步学习了Java简单的输入和输出,String类的对象创建后不能修改,它是不可变的,在Java中浮点型默认是double型与C中的int型不 ...

  10. java从控制台接收一个数字

    //时间:2017/7/22//作者:江骆//功能:从控制台接收一个数import java.io.*;  //引入一个IO流的包public class helloworld1{    public ...