什么是渐进式 web 应用?

渐进式 web 应用(PWA)是一种使用 web 平台技术构建的应用,但它提供了类似于平台特定应用的用户体验。

平台特定应用

平台特定应用是针对特定操作系统(OS)和/或设备类别开发的,例如 iOS 或 Android 设备,通常使用平台供应商提供的 SDK。它们通常通过供应商的应用商店分发,用户可以在那里找到和安装它们,它们随后对用户来说就像是他们设备的一个永久附加特性,以某种方式扩展了其功能。

平台特定应用的好处包括:

  • 用户易于访问:它们在设备上有自己的图标,使用户容易找到和打开它们。
  • 离线和后台操作:它们能够在用户没有与之交互和设备离线时运行。这使得例如聊天应用可以在没有打开时接收消息,并向用户显示通知。它还使得新闻应用可以在后台更新,以便即使设备离线也可以显示新鲜的内容。
  • 专用 UI:它们可以实现自己独特的、沉浸式的 UI。
  • 操作系统集成:它们可以与主机操作系统集成:例如,一个消息应用可以注册为一个分享目标,使用户可以在照片应用中选择一张图片并使用消息应用发送。它们还可以访问设备特性,如相机、GPS 或加速度计。
  • 应用商店集成:它们通过应用商店分发,给用户一个单一的地方来找到它们,并且提供一种一致的方式来决定是否要安装它们。

传统网站

传统上,网站更像是“用户访问的地方”,而不是“用户拥有的东西”。通常,一个网站:在用户不访问它时,在用户的设备上没有存在感,只能通过用户打开浏览器并导航到该网站来访问,而且高度依赖于网络连接。

然而,网站相比平台特定应用有一些好处,包括:

  • 单一代码库:因为 web 本身就是跨平台的,一个网站可以从一个代码库运行在不同的操作系统和设备类别上。
  • 通过 web 分发:web 是一个很好的分发平台。网站被搜索引擎索引,并且可以通过 URL 来分享和访问。一个网站可以分发而无需注册任何供应商的应用商店。

渐进式 web 应用

渐进式 web 应用结合了传统网站和平台特定应用的最佳特性。

PWA 具有网站的优势,包括:

  • PWA 是使用标准的 web 平台技术开发的,所以它们可以从单一代码库在多个操作系统和设备类上运行。
  • PWA 可以直接通过 web 访问。

PWA 也具有平台特定应用程序的许多优势,包括:

  • PWA 可以安装在设备上。这意味着:
    • PWA 可以从平台的应用商店安装,也可以直接从 web 安装。
    • PWA 可以像平台特定的应用程序一样安装,并可以自定义安装过程。
    • 一旦安装,PWA 会在设备上得到一个应用图标,与平台特定应用程序一样。
    • 一旦安装,PWA 可以作为独立的应用程序启动,而不是作为浏览器中的网站。
  • PWA 可以在后台与离线操作:一个典型的网站只在被浏览器加载后才处于活动状态。PWA 可以:
    • 在设备没有网络连接时工作。
    • 在后台更新内容。
    • 对来自服务器的推送消息做出响应。
    • 使用操作系统的通知系统显示通知。
  • PWA 可以使用整个屏幕 (en-US),而不是在浏览器 UI 中运行。
  • PWA 可以与设备集成,注册为共享目标和来源,并访问设备特性。
  • PWA 可以在应用商店以及通过 web 公开发布。

PWA 和浏览器

当你在浏览器中访问一个网站时,从视觉上可以明显看出网站是“运行在浏览器中的”。浏览器 UI 为网站提供了一个可见的框架,包括后退/前进按钮等 UI 功能和页面的标题。你的网站调用的 Web API 是由浏览器引擎实现的。

PWA 通常看起来像平台特定应用程序——它们通常是在没有浏览器 UI 环绕的情况下显示的——但从技术上讲,它们仍然是网站。这意味着它们需要一个浏览器引擎,如 Chrome 或 Firefox 中的引擎,来管理和运行它们。对于平台特定应用程序,平台操作系统管理这个应用程序,提供其运行的环境。对于 PWA,浏览器引擎执行这一后台角色,就像它对普通网站所做的一样。

比较传统网站、PWA 和平台特定应用程序的运行时环境的图表

在我们的 PWA 文档中,我们有时会提到浏览器在后台发挥这种作用。例如,我们可能会说,“当收到推送通知时,浏览器会启动 PWA 的 service worker。”在这种情况下,浏览器的活动完全在后台。从 PWA 的角度来看,它也可以由操作系统启动。对于某些系统,如 Chromebook,“浏览器”和“操作系统”之间可能根本没有区别。

PWA 的技术特性

因为 PWA 是网站,所以它们具有与任何其他网站相同的基本特性:至少有一个 HTML 页面,其可能会加载一些 CSS 和 JavaScript。与普通网站一样,页面加载的 JavaScript 具有一个全局的 Window 对象,并且可以通过该对象访问所有可用的 Web API。

除此之外,PWA 还具有一些额外的特性:

  • 一个 web 应用程序清单文件,至少提供浏览器需要的信息来安装 PWA,如应用程序名称和图标。
  • 一个 service worker,至少提供基本的脱机体验。

Web 应用程序清单

PWA 必须有一个 web 应用程序清单,并且清单必须包含足够的信息以便浏览器安装 PWA

清单可以定义 PWA 外观的许多其他方面,比如主题颜色 (en-US)背景颜色,以及其行为,包括其充当其他应用程序数据的共享目标 (en-US)的能力或处理特定文件类型 (en-US)的能力。

Service worker

PWA 必须有一个 service worker,并且 service worker 必须实现至少最小程度的脱机体验。

service worker 鼓励一种架构,其中应用程序的页面(即网站的传统部分)实现用户界面,service worker 实现可以支持脱机和后台操作的后端,使 PWA 的行为更像应用程序而不是网站。这是因为 service worker 可以在需要时(例如,处理推送通知)由浏览器在后台启动。

PWA 和单页应用

传统上,网站是作为相互链接的页面集合构建的。当用户从站点的一个页面点击链接到同一站点的另一个页面时,浏览器会将新页面作为一个完全新的实体加载,包括 HTML 和 HTML 加载的子资源,如 CSS 和 JavaScript。在单页应用中,站点由一个 HTML 页面组成,当用户点击内部链接时,由 JavaScript 从服务器获取新内容并更新页面的相关部分来处理。

单页应用可以提供更接近平台特定应用程序的用户体验,所以 PWA 通常以单页应用实现。特别是,单页应用使实现无缝的用户界面变得更加容易,在该用户界面中,用户被呈现一个单一、一致的页面,只更新页面相关部分以响应用户与应用程序的交互。

然而,PWA 不必是单页应用,单页应用也不必是 PWA。

渐进增强

虽然渐进增强是大多数网站的一个理想的属性,但对于 PWA 来说尤其重要,因为它们期望在广泛的设备上运行,并且通常使用可能不被所有浏览器支持的高级 Web API。

渐进增强的一个基本组成部分是,如果用户通过在浏览器中输入其 URL 的方式在网络上访问你的 PWA,则用户可以像访问普通网站一样与应用程序交互。但是如果浏览器可以安装它,则会提示用户安装它,并且该应用程序将作为设备上的新功能出现。

PWA 应该对高级 API 执行特性检测并提供可接受的回退体验。

例如,后台同步 API 使 PWA 可以要求服务工作线程在设备连接时尽快发出网络请求。这个经典的用例是消息传递。假设用户编写了一条消息,但当用户尝试发送消息时,设备处于离线状态。后台同步 API 使设备能够在连上网后在后台发送消息。在不支持后台同步的设备上,该应用程序应该让用户知道消息无法发送,并给他们再次重试的机会。