PWA(渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。

PWA的特点:

  • Discoverable, 内容可以通过搜索引擎发现。

  • Installable, 可以出现在设备的主屏幕。

  • Linkable, 你可以简单地通过一个URL来分享它。

  • Network independent, 它可以在离线状态或者是在网速很差的情况下运行。

  • Progressive, 它在老版本的浏览器仍旧可以使用,在新版本的浏览器上可以使用全部功能。

  • Re-engageable, 无论何时有新的内容它都可以发送通知。

  • Responsive, 它在任何具有屏幕和浏览器的设备上可以正常使用——包括手机,平板电脑,笔记本,电视,冰箱,等。

  • Safe, 在你和应用之间的连接是安全的,可以阻止第三方访问你的敏感数据。

PWA的优势:

  • 减少应用安装后的加载时间, 多亏了 Service Workers 来进行缓存, 以此来节省带宽和时间。

  • 当应用有可用的更新时,可以仅仅去更新发生改变的那部分内容。与之相反,对于一个原生应用而言,即便是最微小的改动也需要强制用户去再次下载整个应用。

  • 外观和使用感受与原生平台更加融为一体——应用图标被放置在主屏幕上,应用可以全屏运行,等。

  • 凭借系统通知和推送消息与用户保持连接,对用户产生更多的吸引力,并且提高转换效率。

  PWA 所需的关键要素是 service worker 支持。 值得庆幸的是,桌面和移动设备上的所有主流浏览器都支持 service worker。

Service Worker

  •  Service Worker 是浏览器和网络之间的虚拟代理。解决了正确缓存网站资源并在用户设备脱机时使其可用的问题。
  •  出于安全原因,Service Workers只能在HTTPS中执行。
  •  Service Worker独立于浏览器JavaScript主线程,有它自己独立的生命周期。

  注意:Service Workers 大量使用 promise,因为他们通常会等待响应通过,之后他们会以成功或失败的方式响应。

注册

  首先使用该 ServiceWorkerContainer.register() 方法注册服务工作者。如果成功,Service Worker 将被下载到客户端,并尝试安装 / 激活。

  安装完成后,Service Worker会经历以下生命周期:

  1. 下载(download)

  2. 安装(install)

  3. 激活(activate)

  用户首次访问 Service Worker 控制的网站或页面时,Service Worker 会立刻被下载。之后至少每24小时它会被下载一次。它可能被更频繁地下载,不过每24小时一定会被下载一次,以避免不良脚本长时间生效。

  在下载完成后,开始安装Service Worker,在安装阶段,通常需要缓存一些我们预先声明的静态资源,在我们的示例中,通过urlsToCache预先声明。

  在安装完成后,会开始进行激活,浏览器会尝试下载Service Worker脚本文件,下载成功后,会与前一次已缓存的Service Worker脚本文件做对比,如果与前一次的Service Worker脚本文件不同,证明Service Worker已经更新,会触发activate事件。完成激活。

install

  在安装完成后,尝试缓存一些静态资源:

  self.addEventListener('install', function(event) {
   self.skipWaiting();
   event.waitUntil(
   caches.open(CACHE_NAME)
   .then(function(cache) {
   return cache.addAll(urlsToCache);
   })
  );
  });

  首先,self.skipWaiting()执行,告知浏览器直接跳过等待阶段,淘汰过期的Service Worker脚本,直接开始尝试激活新的Service Worker。

  然后使用caches.open打开一个Cache,打开后,通过cache.addAll尝试缓存我们预先声明的静态文件。

监听fetch,代理网络请求

  页面的所有网络请求,都会通过Service Worker的fetch事件触发,Service Worker通过caches.match尝试从Cache中查找缓存,缓存如果存在,则直接返回缓存中的response,否则,创建一个真实的网络请求。

  self.addEventListener('fetch', function(event) {
   event.respondWith(
   caches.match(event.request)
   .then(function(response) {
   if (response) {
   return response;
   }
   return fetch(event.request);
   })
   );
  });

  如果我们需要在请求过程中,再向Cache Storage中添加新的缓存,可以通过cache.put方法添加,

activate

  1. 首先有一个白名单,白名单中的Cache是不被淘汰的。

  1. 之后通过caches.keys()拿到所有的Cache Storage,把不在白名单中的Cache淘汰。

  1. 淘汰使用caches.delete()方法。它接收cacheName作为参数,删除该cacheName所有缓存。

  self.addEventListener('activate', function(event) {
  var cacheWhitelist = ['counterxing'];
​
   event.waitUntil(
   caches.keys().then(function(cacheNames) {
   return Promise.all(
   cacheNames.map(function(cacheName) {
   if (cacheWhitelist.indexOf(cacheName) === -1) {
   return caches.delete(cacheName);
   }
   })
   );
   })
   );
  });

参考博客:Service Worker学习与实践(一)——离线缓存 https://juejin.im/post/5ba0fe356fb9a05d2c43a25c

渐进式web应用 (PWA)的更多相关文章

  1. 试着给VuePress添加渐进式Web应用(PWA)支持,基于vuepress/plugin-pwa,点亮离线访问

    背景 有时候,我们也希望VuePress构建的文档中心能支持离线访问,这时候我们需要给他添加渐进式Web应用(PWA,Progressive Web App)的支持,根据官方文档指引,我们可以借助插件 ...

  2. 什么是渐进式Web App(PWA)?为什么值得关注?

    转载自:https://blog.csdn.net/mogoweb/article/details/79029651 在开始PWA这个话题之前,我们先来看看Internet现状. 截至2017年1月, ...

  3. 天人合一物我相融,站点升级渐进式Web应用PWA(Progressive Web Apps)实践

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_216 PWA(Progressive web apps,渐进式 Web 应用)使用现代的 Web API 以及传统的渐进式增强策略 ...

  4. Blazor WebAssembly 渐进式 Web 应用程序 (PWA) 使用 LocalStorage 离线处理数据

    原文链接:https://www.cnblogs.com/densen2014/p/16133343.html Window.localStorage 只读的localStorage 属性允许你访问一 ...

  5. 渐进式Web应用(PWA)入门教程(上)

    最近关于渐进式Web应用有好多讨论,有一些人还在质疑渐进式Web应用是否就是移动端未来. 但在这篇文章中我并不会将渐进式APP和原生的APP进行比较,但有一点是可以肯定的,这两种APP的目标都是使用户 ...

  6. 渐进式Web应用(PWA)入门教程(下)

    上篇文章我们对渐进式Web应用(PWA)做了一些基本的介绍. 渐进式Web应用(PWA)入门教程(上) 在这一节中,我们将介绍PWA的原理是什么,它是如何开始工作的. 第一步:使用HTTPS 渐进式W ...

  7. PWA 渐进式Web应用程序 - 解释

    想象一下,如果一个网站上所有的功能都能够作为一个移动应用程序为用户所用——任何设备上都可以使用.可接收所有的通知.离线模式可用,为了实现这个愿景,2015年,谷歌创造了渐进式Web应用程序(PWA). ...

  8. (转)PWA(Progressive Web App)渐进式Web应用程序

    PWA 编辑 讨论 PWA(Progressive Web App)是一种理念,使用多种技术来增强web app的功能,可以让网站的体验变得更好,能够模拟一些原生功能,比如通知推送.在移动端利用标准化 ...

  9. 渐进式Web应用(PWA)

    什么是渐进式Web应用? 渐进式Web应用是一种全新的Web技术,让Web应用和原生APP的体验相近或一致. 渐进式Web应用它可以横跨Web技术及Native APP开发的解决方案,对于开发者的优势 ...

随机推荐

  1. 用 python 解决线性代数中的矩阵运算

    用 python 解决线性代数中的矩阵运算 矩阵叉乘 矩阵求逆 矩阵转置 假定AX=B,求解未知矩阵X 矩阵的行列式值|matrix| 未完待续..... import sys from PyQt5. ...

  2. Typora下载安装教程

    Typoa下载和安装 Typora---程序员记事本!!! 这里我们选择Typora作为我们的编辑器,功能的强大需要各位自己去体会. Typora下载地址 点击链接打开,然后选择Download! 根 ...

  3. 使用PAM模块实现普通用户之间su免密切换

    参考自:Allow user1 to "su - user2" without password https://unix.stackexchange.com/questions/ ...

  4. Spark-StructuredStreaming 下的checkpointLocation分析以及对接 Grafana 监控和提交Kafka Lag 监控

    一.Spark-StructuredStreaming checkpointLocation 介绍 Structured Streaming 在 Spark 2.0 版本于 2016 年引入, 是基于 ...

  5. AotucCrawler 快速爬取图片

    AotucCrawler 快速爬取图片 今天介绍一款自动化爬取图片项目. GitHub: https://github.com/YoongiKim/AutoCrawler Google, Naver ...

  6. tomcat去除项目访问路径限制

    首先打开tomcat的\apache-tomcat-7.0.73\confserver.xml文件 在 </ <Host name="localhost" appBas ...

  7. npm 配置 registry 以及使用 nrm

    由于众所周知的原因,我们的内网链接互联网时非常不稳定,速度慢而且经常下载失败.为了提高下载安装 npm 包的体验,很多人都会把 npm 的 registry 配置成国内镜像,我们一般用的比较多的就是淘 ...

  8. SubsamplingScaleImageView 源码解析

    一开始没打算分析 SubsamplingScaleImageView 这个开源的图片浏览器的,因为这个库在我们 App 中使用了,觉得自己对这个库还是比较熟悉的,结果某天再看看到源码介绍的时候,才发现 ...

  9. R之dplyr::select/mutate函数扩展

    select函数 dplyr包select函数用的很多,不过我们一般也是通过正反选列名或数字来选择列. 常见用法如: select(iris,c(1,3)) select(iris,1,3) #同上 ...

  10. Can't connect to HTTPS URL because the SSL module is not available. - skipping

    今天用pip3安装第三方库的时候报了这样一个错: Can't connect to HTTPS URL because the SSL module is not available. - skipp ...