0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

未来可期之PWA渐进式Web应用

张康康 2019-07-29 18:27 次阅读

作者 | 极链科技Video++前端Team子昂

整理 | 包包

前端技术这几年发展迅速,其中就有PWA,全名Progressive Web APP即渐进式Web应用程序,在2016年,Google I/O 大会上提出的一个 Next Web Generation 概念。PWA是专门应对手机web开发提出来的,它可以将 web 和 app 各自优势结合到一起:渐进式、离线加载等实现趋近于App的交互,实时更新、可推送、可安装等,达到一个当我们使用Web应用时体验可以像一款原生App一样。特别说明一下,很多人以为PWA是一种新技术,然而并不是,它是应用多项Web技术的一个集合,其中核心技术即 “Service Worker”,我们把它放在后面说。

目前我们使用Web应用和很多国内SPA一样,通常都是在打开一个页面的时候发起请求来获取数据,在离线的情况一般就不可用了。而PWA是旨在改善Web的体验,将网络的优势与应用的优势融合起来,给用户更优的体验。PWA具有的特点分别是:

  • 可靠即使在不稳定的网络环境下(包括无网络的情况),也可以立即加载并展现。

  • 响应快速用户交互响应迅速,有平滑流畅的动画进行响应。

  • 粘性像设备上原生应用一样,具有逼真的用户体验,同时用户还可以将其添加到桌面。

  • 渐进式适用于使用任何浏览器的用户,因为它的核心是以渐进式增强。

  • 自适应任何形式上都可使用:桌面设备、移动设备等。

  • 安全通过HTTPS,防止窥探以及保障内容不会被篡改。

  • 可发现因为W3C清单和服务工作注册范围,可以让搜索引擎找到它,将其识别为“应用程序”。

  • 可安装用户再去app store去下载,可以直接将应用添加到主屏幕从而保留进行使用。

  • 可链接可以通过url地址分享应用程序,省去了复杂的安装。

我们在其中选择几点着重解释一下:

(1)可安装

它是指在设备的主屏幕上像原生APP一样留有图标。要实现这特点首先需要提供Web app manifest(web应用程序清单),manifest是一个json文件,它里面描述的是应用程序的图标如何在主屏幕显示以及点击后跳转到的页面是什么,我们可以直接在html中引用它“”,它的格式如下图:

f743d4a91edd4087b2ccae9fbc327f18


其中几个属性代表的意思是:

• start_url 设置跳转的地址

• icons 让我们设置页面的图标

• background_color 设置背景颜色, 应用启动后会立即使用此颜色,这一颜色将保留在屏幕上,直至网络应用首次呈现

• theme_color 会设置主题颜色

• display 设置是否启动状态

这里的display设置的是网络应用是否隐藏浏览器的UI,当display的值为"standalone"时,网络应用隐藏浏览器的UI;当display的值为"browser"时,则显正常显示。


关于manifest.json里字段更加具体的含义,感兴趣的同学可以去谷歌开发者文档里探索一下啦。

(2)这是一个非常diao的特性:可离线使用即在没有网络环境的情况下也能打开应用程序,实现这一强大功能的幕后大佬是:Service worker(服务人员)。

Service worker其实是一段脚本,我们平时缓存都是session、localStorage、CacheStorage这些,PWA通过Service worker访问CacheStorage实现缓存及离线开发。

这里简单讲一下Service worker的概念,通常浏览器加载页面运行的是主JavaScript线程,而Service worker作为一个独立的线程,可以理解为在浏览器身后默默无闻运行的一个线程。

正因为这个特性,Service worker无论如何都不会阻塞我们的主线程,意味着不会使我们的浏览器页面卡顿等。在使用Service worker时要注意,我们使用的协议必须是https,当然如果想在本地开发弄一个https是很让人头疼的,幸运的是Service worker允许在本地hostlocalhost或者127.0.0.1也可以跑起来。

我们来看一下,如何注册Service worker?

首先,我们要判断当前使用的浏览器是否支持Service worker,支持我们才能继续进行下去,如果支持,那么在页面加载的时候注册位于/sw.js的Service worker,看下面的代码:

4e443fe283514610b9d91e33eaa5e2f2


每次页面加载成功后,就会调用 register() 方法,浏览器将会判断 Service Worker 线程是否已注册并做出相应的处理。

register 方法的 scope 参数是可选的,用于指定你想让 Service Worker 控制的内容的子目录。本 demo 中服务工作线程文件位于根网域, 这意味着服务工作线程的作用域将是整个来源。

关于Service Worker更加详细的介绍,感兴趣的同学可以参考MDN文档。

对啦,Service worker也是有生命周期的,它的详细介绍可以参考下图:

fa02542b561142808d8e2540ddba79ac


说了这么多,那我们开发者如何了解一个网页是否具备了 PWA 的一些特点呢?

我们可以通过谷歌开发工具,在其中找到Audits面板,它可以检测出页面是否具备PWA的特点:

c074863701fb45d2bda98d71b17c29a7


下面我们来看一个简单的demo,看一下PWA在离线时依然能够快速加载应用。

首先我们将加载loading直接显示出来,确保用户在打开网页可以立即看到,让用户知道此时页面在加载中:


此时我们将html页面中引用的js的注释取消,将我们写的虚假数据加载出来:


那么如何实现缓存呢?即在离线的环境下加载出来数据,此时将网络环境调成Offline,页面无法加载:

这里就要应用到上面我们说的Service worker服务工作线程来实现。

先来检查一下浏览器是否支持Service worker:

90ab65473d7049e28f0c99a53e21f0e8


如果浏览器支持,就会注册服务工作线程,当用户第一次打开页面时就会触发安装事件从而将缓存所需的内容。

下图为核心代码,实现了真正的离线缓存:

96d411faaa134a55943a637513034477


首先,我们需要通过 caches.open() 打开缓存并提供一个缓存名称。提供缓存名称可让我们对文件进行版本控制,或将数据与 App Shell 分开,以便我们能轻松地更新某个数据,而不会影响其他数据。

我们在install侦听器下面添加activate事件侦听器,因为activate事件会在Service worker启动时触发,图中activate事件里面的代码可以确保文件更改的时候更新缓存

最后我们需要从缓存中提取我们需要的内容,就是下面这段代码:

0fe7d54c60b04209b4bcebc32d44343c


caches.match() 会由内而外对触发抓取事件的网络请求进行评估,并检查以确认它是否位于缓存内。它随即使用已缓存版本作出响应,或者利用 fetch 从网络获取一个副本,response 通过 e.respondWith() 传回至网页。

现在来看一下我们在离线的时候页面是否会加载呢?


如图,在Offline的网络环境下,我们的应用成功加载出来了。

这个小demo就到这里啦!

目前Progressive Web App仍处于初级阶段,国内普及度还不够,但是不可忽视其背后的的技术,以及对前端全新的定位,或许它会像十年前的AJAX那样重新改变前端的生态。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏

    评论

    相关推荐

    一文读懂芯片混合键合工艺流程

    在封装史上,最后一次重大范式转变是从引线键合到倒装芯片。从那时起,更先进的封装形式(例如晶圆级扇出和 TCB)一直是相同核心原理的渐进式改进。
    发表于 02-27 09:24 808次阅读
    一文读懂芯片混合键合工艺流程

    能理解、能设计!建筑行业AI大模型未来可期

    中经过训练和优化的行业大模型,更专注于某个特定领域的知识和技能。领域专业性更强,输出质量更高,特定任务效果更好。   建筑行业AI 大模型未来可期   在建筑行业中,AI大模型的应用已经越来越广泛。广联达科技股份有限公司副总
    的头像 发表于 01-26 09:04 3001次阅读
    能理解、能设计!建筑行业AI大模型<b class='flag-5'>未来</b><b class='flag-5'>可期</b>

    鸿蒙开发基础-Web组件cookie操作

    账户中心。 cookie读写操作 首次打开应用时,应用首页的Web组件内呈现的是登录界面。用户完成登录操作后,会跳转至账号中心界面。首页包含“读取cookie”、“设置cookie”和“删除cookie
    发表于 01-14 21:31

    OneLLM:对齐所有模态的框架!

    OneLLM 是第一个在单个模型中集成八种不同模态的MLLM。通过统一的框架和渐进式多模态对齐pipelines,可以很容易地扩展OneLLM以包含更多数据模式。
    的头像 发表于 01-04 11:27 363次阅读
    OneLLM:对齐所有模态的框架!

    什么是PWAPWA离线方案研究分析

    PWA(Progressive Web App)是一种结合了网页和原生应用程序功能的新型应用程序开发方法。PWA 通过使用现代 Web 技术,例如 Service Worker 和
    的头像 发表于 12-19 09:53 431次阅读
    什么是<b class='flag-5'>PWA</b>?<b class='flag-5'>PWA</b>离线方案研究分析

    石墨烯仍是一种年轻的材料

    安德烈·海姆提出了对石墨烯运用前景的展望:未来应该不只是发挥渐进式的提升作用,而是迈入创造革命性变化的阶段。他进一步解释道,在革命性阶段,二维材料和成千上万种维度的材料将会创造以前材料完全无法实现的东西。
    的头像 发表于 12-12 14:07 383次阅读

    eclipse中没有web怎么办

    在Eclipse中没有Web的情况下,可以采取以下的解决方法: 第一种方法是通过Eclipse的插件来添加Web开发功能。原始的Eclipse版本可能不包含Web开发的相关插件,但用户可以通过
    的头像 发表于 12-06 11:30 1324次阅读

    未来嵌入在哪些方向会更火?

    汽车等等,必然是未来嵌入方向发展的一个趋势。 2、医疗领域:目前小城市的医疗资源是有限的,但是大城市的医疗资源是供不应求的状态,为了提高医疗服务的质量和效率,并改善患者的治疗方案。比如说远程诊断
    发表于 10-27 10:23

    禾多科技渐进式推动全场景无人驾驶的实现

    9月,2023世界智能网联汽车大会——“打造应用新生态 把握投资新机遇”特色专场暨首都学术资源开放共享高端研讨会在北京举办。禾多科技作为领先自动驾驶创新企业代表受邀参会,禾多创始人、CEO倪凯在会上为行业各界嘉宾及媒体分享了禾多自动驾驶前沿研发与量产工作的最新进展。 党的二十大报告中指出,要开辟发展新领域新赛道,不断塑造发展新动能新优势。目前,智能网联汽车已成为全球汽车产业转型升级的战略方向。在汽车产业智能化、网
    的头像 发表于 09-26 10:26 610次阅读

    HarmonyOS—使用Web组件加载页面

    页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景,包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中,若涉及网络资源获取,需要配置
    发表于 08-31 17:51

    如何在交互人脸检测演示中将Web浏览器流用作目标输入?

    无法将 Web 浏览器流用作交互人脸检测演示的目标输入。
    发表于 08-15 06:02

    Web3.0:一段历史

    作者: 李安琪 (W3C),OpenHarmony项目群技术指导委员会-Web3标准TSG成员 Web3,作为近几年炙手可热的一个关键词,承载着诸多行业对下一代互联网应用的期待。时常有业界友人询问
    的头像 发表于 08-01 08:46 371次阅读
    <b class='flag-5'>Web</b>3.0:一段历史

    Web开播系统的技术演进

    随着直播SaaS业务的深入发展,Web端开播的诉求变得越来越强烈,对比客户端开播工具如OBS,Web开播与SaaS平台亲和度高,可以让用户快速体验平台全流程,同时易于分享链接,快速连麦。因此,寻求
    的头像 发表于 06-30 10:34 426次阅读

    未来可期|鑫金晖国际电子电路(深圳)展会圆满收官!

    -国际电子电路(深圳)展会圆满收官行而不辍,未来可期》》》》》展会—概览作为全球最具影响力,规模最大及最具代表性之一的线路板及电子组装行业盛会--国际电子电路(深圳)展览会(HKPCAShow)圆满
    的头像 发表于 06-27 10:06 312次阅读
    <b class='flag-5'>未来</b><b class='flag-5'>可期</b>|鑫金晖国际电子电路(深圳)展会圆满收官!

    10余款开源静态站点生成器

    Bridgetown 是下一代渐进式站点生成器和全栈框架,由 Ruby 提供支持。Bridgetown 先获取站点内容、API 数据和前端资产;然后以 Markdown、Liquid、ERB 和许多
    的头像 发表于 05-22 16:37 736次阅读
    10余款开源静态站点生成器