渐进式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
|
|
注意,由于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应用依赖于服务器,一旦链接出了问题,会导致应用崩溃。离线优先的提出旨在解决该问题。离线优先接受上述情况,可能会造成内容上不是最新,但是应用一直保持可用。
常用缓存模式:
仅缓存
从缓存中响应所有资源,缓存中找不到,请求失败。对静态资源很实用。
缓存优先
从缓存中响应所有资源,缓存中找不到,从网络中请求并返回。
仅网络
直接从网络中请求,找不到,请求失败。
网络优先
直接从网络中请求,找不到,从缓存中返回。
缓存优先,并频繁更新缓存
在缓存优先的基础上,在网络请求返回的时候,更新到缓存中。
网络优先,并频繁更新缓存
在网络优先的基础上,在网络请求返回的时候,更新到缓存中。