PWA(一)

渐进式Web应用(Progressive Web App),结合Native应用的优点和Web快速开发的特点,从一个简单的Web站点开始,慢慢获得用户权限,不断完善功能,一步一步占据用户设备上永久性位置,也就为什么称之为”渐进式”。

PWA优势:

  • 弱网环境下的可用性(service worker)
  • 加载速度快(service worker和cachestorage)
  • 推送通知
  • 沉浸式体验(主屏启动,启动动画,全屏运行)

浏览器支持

  • Blink:完全支持
  • Gecko:完成支持
  • EdgeHTML:积极支持
  • Webkit:阉割版

Service Worker

Service Worker是改进版的Web Worker`,它像浏览器与网络之间的代理,可以拦截、处理、响应HTTP请求,配合Cache Storage可以细粒度控制HTTP请求文件的缓存。

注册第一个service work

1
2
3
if ('seriveWorker' in navigator) {
navigator.serviceWorker.register('/sw.js', {scope: '/'}).then().catch()
}

注意,由于service worker可以拦截请求,修改内容,为避免的恶意第三方利用权限,只有HTTPS的页面才能注册service worker,开发阶段,localhost可以绕过这一安全限制。

作用域

出于对service worker权限的限制,每个service worker都有作用域限制,控制有限范围。这个范围通过放置service worker的JavaScript文件目录决定,也可以在注册时通过scope改变,只能改小不能改大

例如/js/sw.js只对js目录下的请求起作用,不能影响根目录下的其他请求。比如有这样的目录结构/style.css或者/other的请求就不受控制。

生命周期

installing

通过register注册新的service worker时进入installing

installed/waiting

一旦installing成功,service worker进入installed状态,一般情况下,会马上进入activating状态,如果另外的正在激活的service worker正在控制页面,则进入waiting状态。(旧的service worker作用域中的每个标签页和窗口关闭,或者导航到一个不再其控制范围内的页面,新的service worker才起作用)

activating

在service worker接管页面前会触发activate事件。

activated

service worker激活之后,开始接管页面。service worker只能够在页面开始加载之前加载页面,页面在service worker激活之前已经开始加载,service worker是没办法控制的,这么做保证了页面请求的一致性,防止出现部分更新的情况。

redundant

Service worker注册失败或者被替换,进入redundant阶段。

事件

install

在新的service worker安装或者更新时触发。

fetch

发生网络请求是触发。

activate

service worker激活是触发。

CacheStorage

CacheStorage相比旧的AppCache,将控制权交个了开发人员,更加灵活。CacheStorage遵循”同源策略”。

API

caches.open(key)

打开或者创建一个缓存,返回promise

caches.add(path)

请求资源,并加入到缓存中。

caches.addAll([path])

请求一组资源,并加入到缓存中。

caches.match(path)

从缓存中取回资源。

caches.keys()

获取所有缓存名称。

caches.delete(name)

删除缓存。

caches.put(path, response)

将缓存资源复制到另一个缓存。

缓存模式

Web应用依赖于服务器,一旦链接出了问题,会导致应用崩溃。离线优先的提出旨在解决该问题。离线优先接受上述情况,可能会造成内容上不是最新,但是应用一直保持可用。

常用缓存模式:

仅缓存

从缓存中响应所有资源,缓存中找不到,请求失败。对静态资源很实用。

缓存优先

从缓存中响应所有资源,缓存中找不到,从网络中请求并返回。

仅网络

直接从网络中请求,找不到,请求失败。

网络优先

直接从网络中请求,找不到,从缓存中返回。

缓存优先,并频繁更新缓存

在缓存优先的基础上,在网络请求返回的时候,更新到缓存中。

网络优先,并频繁更新缓存

在网络优先的基础上,在网络请求返回的时候,更新到缓存中。