OceaBase开发者大会落地上海!4月20日共同探索数据库前沿趋势!报名戳 了解详情
写点什么

百度搜索对 PWA 的探索和初步实践

  • 2017-04-27
  • 本文字数:4233 字

    阅读完需:约 14 分钟

本文是百度搜索资深 Web 前端工程师沈洲在前端之巅微信群中的分享整理总结而成。

一、什么是 PWA

1.PWA 的概念

PWA 的全称为:Progressive Web Apps(渐进式 Web Apps),是 Google 提出的,可以带来突破性体验的 Web 应用。

2.PWA 的特征

Google 所阐述的 PWA 主要特性为:Reliable(可依赖)、Fast(快)和 Engaging(有粘性的)。

就我个人理解,PWA 与传统的 Web 比,主要是多了下面几个关键特性:

(1)离线可用;

(2)主屏图标;

(3)启动动画;

(4)通知。

同时,这里要强调一下渐进增强(Progressive),这也是我们最容易忽略的地方。也就是说,PWA 不是 0 或者 1,而是渐进增强——我们可以用 PWA 涉及到的技术,逐步改善移动 Web 的体验,而不是说做了什么,才是真正的 PWA。

3.PWA 的关键技术

PWA 涉及到的关键技术是:

(1) Service Workers

(2) Add to home screen:manifest

(3) Web push notificatikons

接下来会在我们的专栏里讲到 Service Workers 和 add to home screen,由于受限网络环境,现在没有办法来做和演示 Web push notifications。为了让大家直观体验一个入门的 PWA 应用的感受,首先请看一段我们做的一个 PWA 的视频:

也可以扫码访问(设备要求:Chrome for Android 56+):

二、PWA 开发背景

1. 背景

手机移动互联网的兴起,使得 App 占据了大家在互联上的部分时间。大家会通过移动 App 来满足自己日常的需求,所以移动互联网的入口不再是单一的浏览器,而是从手机桌面可以直达的 App。

但是,移动原生的 App 是把双刃剑,它也有着其缺点:

(1)打开率低:90% 的用户打开的 App 不会超过 10 个;

(2)安装麻烦:移动 App 引导安装非常麻烦;

(3)信息孤立:App 之间很难信息打通。

而大部分用户的 80% 时间,都给了不超过 3 个的超级 App

2.PWA 和原生 App 的差异

我们来从一些特性上,对 PWA 和原生 App 进行对比,如下表所示。

3.PWA 对 Web App 的影响

总结一下,PWA 的对于 Web App 带来的影响:

(1)体验层面向原生 App 靠拢:离线可用,主屏图标入口,启动动画,基本上可以和原生 App 的体验一致;

(2)开发模式的变革:Web 开发同时考虑离线模式和体验;

(3)App 的安装更新机制带来运营方式的变化:url 可达,应用间可链接,不仅仅依赖商场分发应用。

三、PWA 开发步骤

这里以我们开发的百度天气为例,来阐述 PWA 开发过程中的关键步骤。

1. 基本功能介绍

“百度天气”既是一个 PWA 的应用,也是一个普通的 Web 页面。在利用 PWA 提供的特性之前,首先需要在普通的 Web 页面上实现天气相关功能。主要包括:定位当前城市、获取城市天气、切换城市,这部分的具体业务实现不再赘述,我们下文主要介绍 PWA 相关特性的开发过程。

2. 页面代理:Service Worker

百度天气的 Service Worker 位于 /sw.bundle.js,使用这一路径即可在 navigator.serviceWorker 上加以注册,此时 Service Worker 的 install 事件会被立即触发。注册代码如下:

下次用户访问百度天气时,上述注册的 Service Worker 会被激活,Service Worker 的 activate 事件被触发。此后 Service Worker 就可以截获页面请求来应用缓存策略了。在 Service Worker 被激活时,会更新缓存以移除旧版本的百度天气资源:

Service Worker 通过 fetch 事件可以截获来自天气页面的网络请求,这些请求包括页面脚本、图片、字体,以及获取天气数据的 AJAX。我们对这些请求应用不同的缓存策略:

上述代码片段遵循的标准: https://www.w3.org/TR/service-workers/ (Working Draft)

这些功能的浏览器兼容性:Android Browser 53+,Opera Mobile 37,Chrome for Android 56,Samsung Internet 4+,QQ Browser 1.2 文件:sw-register.png,sw-activate.png,sw-fetch.png

3. 缓存策略:fetch

在 Service Worker 实现的缓存策略中,Fetch API 用来发送真正的网络请求。因为可以使用 JavaScript API 管理缓存,所以可以实现很灵活的缓存策略。比如缓存优先——首先查看缓存,当缓存失效时再去访问网络。这一策略适用于资源文件,如字体、样式、图片等。百度天气的背景图片(根据天气不同而不同)、样式表、页面脚本都采用这一策略。其流程图如下:

Service Worker 的 API 都采用 Promise 风格的异步接口,因此上述流程并不复杂:

网络优先:首先查看网络,当网络失败时应用本地缓存。这一策略适合实时数据,比如获取天气信息的 AJAX 请求。这样每次页面刷新都可以获得最新的天气信息,当离线时会降级到使用本地缓存。并给出离线的提示。

先缓存后网络:对于实时性要求不高的数据,还可以先使用缓存更新页面,再去触发网络请求。这需要页面脚本中使用 Caches API 和 Fetch API,存在兼容性问题。(百度天气中没有使用该策略)。

上述代码片段遵循的标准: https://fetch.spec.whatwg.org/(Living Standard)

这些功能的浏览器兼容性:Android Browser 53+,Opera Mobile 37+,Chrome for Android 56+,QQ Browser 1.2+

上述图片参考: https://jakearchibald.com/2014/offline-cookbook/

4. 应用清单:Manifest

Web App Manifest 只需作为一个普通的 link 标签引入到 HTML 页面中。可实现的 PWA 特性包括: App Install Banner,桌面图标和文字,以及启动页面的 UI 元素。

应用清单遵循的标准: https://www.w3.org/TR/appmanifest/(Working Draft)

该特性的浏览器兼容性:Chrome for Android 56+,Samsung Internet 4+,Opera Mobile 37+,QQ Browser 1.2+

文件:manifest.png, 1.png, 2.png, 3.png

四、PWA 开发总结 1.Service Worker

开发过程中,主要技术点就是 Service Worker,所以在此做一下 Service Worker 方面的总结,分为两方面:注册 Service Worker、更新 Service Worker。

注册 Service Worker

Service Worker 脚本与页面脚本的执行上下文不同,在百度天气的开发过程中,注册阶段遇到的一些关键点有:

  • 需要 HTTPS 或者安全的域(比如 localhost)。
  • Service Worker 所在文件本身的路径不得低于其注册的 scope(默认为当前路径)。
  • Fetch API 可能不太相同(比如缺少 match 方法),可以通过引入一些 polyfill 来解决。

更新 Service Worker

默认情况下 SW 更新周期为不多于 24 小时,由浏览器自行更新。因此调试时需要额外的工具来及时更新百度天气:

  • Chrome 调试:可在 Chrome 调试中勾选 Update on Reload。
  • 移动端调试:可增加一些调试用功能,比如点 10 下天气更新日期,即可更新 Service Worker。

2. 关于存储

HTML5 Application Cache 被 W3C 废弃以后,客户端 JavaScript 存储大概有三种选择:IndexDB、LocalStorage、Caches API。其中, LocalStorage 大多实现都是同步接口,只适合存少量数据;IndexDB 适合存储需要检索的大量;百度天气选用 Caches API,其接口较为简单易用,况且它是 Service Worker 标准中特意给出的离线缓存 API。

关于 cache 大小:最大存储配额并未标准化,但实现上通常以 Origin 来管理(而非 API),大多浏览器都不小于 50MB,这一配额远大于百度天气的缓存资源大小(<1M)。

关于缓存配额更详细的讨论请点击。

五、PWA 的未来

对任何新技术未来的判定,都不可能一概而论。但PWA 的出现,的确为现有的Web 增加了很多令人鼓舞的特性,同时也带来了很多挑战,比如:

(1)规范标准的确立:一些特新还都是草案,还会有变更;

(2)终端环境的支持:目前国内浏览器和操作系统厂商不支持;

(3)开发模式变革。

但是,在我们做的PWA 的实例中,基于PWA 的Web 也拥有了接近原生App 一样的体验,因此我们有理由认为PWA 会为当前的Web 体验带来一次用户体验上的革命。

同时,因为PWA 对于支持上的问题,对于这些用户体验上的提升的落实,百度搜索也会极其的推动PWA 在国内Web 站点的真正落地,为Web 体验的优化做应该做的事情。

例如,我们很快会在自己厂牌App 使用的浏览器内核(安卓)中支持ServiceWorker,也会进行持续的探索iOS 的实现可能性,为Web 站点的开发者提供更多可用的真实案例和可复用的操作方法。

关于开发模式的方面的摸索,我们后续会把我们一些PWA 相关的开发经验、工具集等逐步总结发布给大家,我们将会长期推动和跟进PWA。

QA 环节

淀粉:如何添加到桌面?

沈洲:对于开发者来说,通过 manifest 来实现添加桌面,对于用户来说,需要浏览器原生支持。

淀粉:老师您好,PWA 和微信小程序的本质区别该如何界定?

沈洲:PWA 是 Web,开发的,可链接的,可索引的;小程序是微信的。

淀粉:现在的浏览器环境,有多少比例支持?

沈洲:在国内目前很少,Android 的 Chrome 支持,但是百度会尽快支持。

淀粉:PWA 是除了谷歌在推动,在业界浏览器商中接受度如何?

沈洲:据我们所知,国内好多厂商包括百度都有相关计划。

淀粉:PWA 是不是只应用于安卓?iOS 上是怎样的情况呢?谢谢。

沈洲:iOS 目前 5 年计划中提到,目前暂不明确具体计划。

淀粉:PWA 技术能否用在 PC 端,并响应式适配移动端?

沈洲:PC 的 Chrome 是支持的,这项技术是 Web 的,不分 PC 和 Mobile,只看浏览器支持力度。

淀粉:请问沈老师,当用户清除系统缓存或浏览器缓存时,PWA 应用会出现什么情况?谢谢。

沈洲:会被清除掉,缓存和域名相关,但是桌面图标还在。

淀粉:以后 Web 站点都是这样的形式吗?原来的 Web 站点还存在吗?

沈洲:PWA 不是 0 或 1,PWA 是渐进式的,在原有基础上增强。

淀粉:PWA 的出现会不会引起搜索引擎算法大的变动?会不会增加爬虫抓取页面内容的难度?

沈洲:百度对于用户体验好的站点,一直都在更青睐,PWA 是索引抓取更友好的。

淀粉:您好,请问 PWA 的标准,是有谁来制定的?

沈洲:PWA 是 W3C 的一系列的标准,所有的厂商实现都会遵循 W3C 规范。

淀粉:如何在开发过程中预览调试?

沈洲:Chrome 有原生很好的 debug 工具。

嘉宾简介

沈洲,百度网页搜索部资深 Web 前端工程师,负责 PWA 和百度搜索结合与落地。沈洲于 2008 年加入百度,先后担任图片搜索 Web 前端技术负责人,视频搜索 Web 前端技术负责人。自 2011 年起,加入网页搜索部 Web 前端团队,担任技术负责人。先后负责百度搜索 Web 前端渲染架构、百度搜索前端速度、百度搜索生态调研、百度搜索用户行为日志专题等工作。自 2015 年底起,负责百度搜索前端极速浏览框架和移动网页加速器工作,目前极速浏览框架覆盖的点出 PV 已经过亿,移动网页加速器覆盖的量已经过千万。


感谢王俊杰对本文的策划,韩婷对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-27 17:122776

评论

发布
暂无评论
发现更多内容

大模型基础应用框架(ReACT\SFT\RAG)技术创新及零售业务落地应用

京东科技开发者

日活3kw下,如何应对实际业务场景中SQL过慢的优化挑战?

派大星

SQL优化 Java 面试题 互联网大厂面试

从自媒体小白到优质KOL,你只差这些个人IP提效神器了!

飞桨PaddlePaddle

百度 BAIDU 自媒体 百度飞桨 飞桨星河社区

全新特征平台 FeatInsight 测试平台上线,现已开放抢先体验!

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

为什么Python语言那么受欢迎呢?

小齐写代码

数字人虚拟主播相比真人主播“更划算”?

青否数字人

产品经理能否带中国AI突破重围?

自象限

AI 大模型

替代 VMware ,为什么需要重新考虑您的存储?

XSKY星辰天合

2024年11款最佳企业文档管理系统大公开!

PingCode

文档管理 文档管理软件

亚洲唯一!京东荣获2024年度Gartner供应链技术创新奖背后的创新探索

京东科技开发者

交互型数字人发展现状!

青否数字人

数字人

后端搞 Cocos 小游戏开发的三点避坑指北

北桥苏

游戏开发 Cocos 小游戏 CocosCreator

观测云产品更新 | 监控器新增组合检测、新增跨工作空间 ServiceMap 等

观测云

APM 监控

RAG一文读懂!概念、场景、优势、对比微调与项目代码示例

百度Geek说

百度AI rag

手把手的使用Toolkit插件在诗情画意中完成AI诗朗诵

华为云开发者联盟

云原生 开发 华为云 华为云开发者联盟 开发插件

阿里巴巴中国站获得联系方式 API(1688.item_get_contact)

技术冰糖葫芦

API API 编排 API 测试 pinduoduo API

设计原则 — LOD 最小知识原则

Lemoon Can

设计原则 LOD 迪米特法则 最小知识原则

AutoMQ 社区双周精选第八期(2024.02.26~2024.03.08)

AutoMQ

Java 云计算 大数据 kafka AutoMQ

2024年,数字化转型还能怎么转?

天津汇柏科技有限公司

数字化转型 软件开发、 软件定制开发

从基础到代码实战,带你进阶正则表达式的全方位应用

华为云开发者联盟

开发 华为云 华为云开发者联盟

最佳实践!云起无垠助力科学技术部信息中心信息系统安全检测分析

云起无垠

京东广告算法架构体系建设--高性能计算方案最佳实践

京东科技开发者

新质生产力发展正当时,华为云开年采购季助中小企业“弯道超车”

YG科技

AutoMQ 携手阿里云共同发布新一代云原生 Kafka,帮助得物有效压缩 85% Kafka 云支出!

AutoMQ

Java 云计算 大数据 kafka

IntelliJ IDEA 2023 for Mac v2023.3.5中文激活版

iMac小白

招聘严峻期我最终拿到5个offer的一些经验分享(附面试题)

测吧(北京)科技有限公司

测试

Take the WiFi card of QCN9274,QCN9074cpu as an example, how to make full use of it?

wifi6-yiyi

Linux cpu wifi

研发日记|一次 Java 乌龙“内存泄露”排查之旅

AutoMQ

Java 大数据 kafka 云原生 AutoMQ

平台工程:构建企业数字化转型的基石

行云创新

DevOps 云原生 IdP 平台工程

交互数字人的生成平台!

青否数字人

数字人

【论文速读】| MOCK:上下文依赖引导的内核模糊测试

云起无垠

百度搜索对PWA的探索和初步实践_百度_沈洲_InfoQ精选文章