PWA 的标签页式应用模式

在渐进式 Web 应用中使用标签页同时处理多个文档

在计算领域,桌面隐喻是一种界面隐喻,它是一组统一的概念,图形界面 (GUI) 使用这些概念来帮助用户更直观地与计算机互动。为了与桌面隐喻保持一致,GUI 标签页模仿了插入到书籍、纸质文件或卡片索引中的经典卡片标签页。标签页式文档界面 (TDI) 或标签页是一种图形控制元素,可让多个文档或面板包含在单个窗口中,并使用标签页作为导航 widget 在文档集之间切换。

渐进式 Web 应用可在由 Web 应用清单中的 display 属性确定的各种显示模式下运行。选项包括 fullscreenstandaloneminimal-uibrowser。这些显示模式遵循明确定义的后备链"fullscreen""standalone""minimal-ui""browser")。如果浏览器不支持给定的模式,则会回退到链中的下一个显示模式。借助 "display_override" 属性,开发者可以根据需要指定自己的回退链。

什么是标签页式应用模式

目前,该平台缺少一种让 PWA 开发者能够为用户提供标签页式文档界面的方式,例如,在同一 PWA 窗口中编辑不同文件。标签页式应用模式可弥合这一差距。

标签页式应用模式的应用场景

以下是一些可能使用标签页式应用模式的网站示例:

  • 允许用户同时编辑多个文档(或文件)的效率类应用。
  • 允许用户在不同标签页的不同聊天室中进行对话的通讯应用。
  • 在新的应用内标签页中打开文章链接的阅读应用。

与开发者构建的标签页的差异

在单独的浏览器标签页中打开文档可实现资源隔离,而这在当今的网络中是不可能的。开发者构建的标签页无法像浏览器标签页那样,以可接受的方式扩展到数百个标签页。导航历史记录、“复制此网页网址”“投放此标签页”或“在网络浏览器中打开此网页”等浏览器功能会应用于开发者构建的标签页式界面页面,但不会应用于所选文档页面。

"display": "browser" 的区别

当前 "display": "browser" 已具有特定含义

使用特定于平台的惯例在用户代理(例如,在浏览器标签页或新窗口中)中打开超链接,从而打开 Web 应用。

虽然浏览器可以随意处理界面,但如果 "display": "browser" 突然表示“在没有浏览器支持的单独应用专用窗口中运行,但具有标签式文档界面”,这显然会严重颠覆开发者的预期。

设置 "display": "browser" 实际上是选择不将应用放入窗口中的方式。

当前状态

步骤 状态
1. 创建说明 已完成
2. 创建规范的初始草稿 已完成
3. 收集反馈并迭代设计 已完成
4. 源试用 已完成
5. 发布 已完成 (ChromeOS)

使用标签页式应用模式

如需使用标签页式应用模式,开发者需要在 Web 应用清单中设置特定的 "display_override" 模式值,以选择启用该模式。

{   "display": "standalone",   "display_override": ["tabbed"] } 

接下来,您可以选择使用属性 "tab_strip" 来微调标签页行为。它有两个允许的子属性:"home_tab""new_tab_button"。如果不存在 "tab_strip" 属性,则默认使用以下对象:

"tab_strip": {   "new_tab_button": {     "url": <start_url>,   }, } 

“首页”标签页

首页标签页是一个固定标签页,如果为应用启用,则在应用打开时应始终显示。此标签页不应进行导航。从此标签页中点击的链接应在新应用标签页中打开。应用可以选择自定义此标签页锁定的网址以及标签页上显示的图标。

"tab_strip" 对象的 "home_tab" 成员包含有关特殊“首页标签页”的信息,该标签页旨在作为应用的顶级菜单。它包含以下成员:

  • "scope_patterns""scope_patterns" 成员是一个网址格式列表,用于定义相对于清单网址的首页标签页范围。

“新建标签页”按钮

"tab_strip" 对象的 "new_tab_button" 成员描述了界面促控(例如按钮)的行为,当点击/激活该促控时,会在应用窗口内打开新的应用上下文。它具有以下成员:

  • "url""url" 成员是一个字符串,表示相对于已处理清单范围内的清单网址的网址。

如果已处理的清单的 new_tab_button 的 "url" 成员位于主标签页范围之外,则应用具有新的标签页按钮。如果应用没有新标签页按钮,浏览器就不会向用户提供“新标签页”功能。

完整示例

用于配置具有标签页式界面的应用行为的完整示例如下所示:

{   "name": "Tabbed App Example",   "start_url": "/",   "display": "standalone",   "display_override": ["tabbed"],   "tab_strip": {     "home_tab": {       "scope_patterns": [         {"pathname": "/"},         {"pathname": "/index.html"}       ]     },     "new_tab_button": {       "url": "/create"     }   } } 

检测标签页式应用模式

应用可以通过在 CSS 或 JavaScript 中检查 display-mode CSS 媒体功能来检测它们是否以标签页式应用模式运行:

@media (display-mode: tabbed) {   /* Styles to apply in tabbed application mode. */ } 
const tabbedApplicationModeEnabled = window.matchMedia('(display-mode: tabbed)').matches; 

与启动处理程序 API 的互动

借助 Launch Handler API,网站可以将应用启动重定向到现有的应用窗口,以防止打开重复的窗口。当标签页式应用设置 "client_mode": "navigate-new" 时,应用启动会在现有应用窗口中打开新标签页。

演示

您可以在 ChromeOS 上试用标签页式应用:

  1. 安装应用 Tabbed Application Mode源代码)。
  2. 点击不同标签页上的不同链接。

标签页式应用模式演示。

反馈

Chrome 团队希望了解您在使用标签页式应用模式时的体验。

介绍 API 设计

标签页式应用模式是否在某些方面无法按预期运行?评论我们创建的 Web 应用清单问题

报告实现方面的问题

您是否发现 Chrome 的实现存在 bug?请访问 new.crbug.com 提交 bug。请务必尽可能详细地说明问题,提供重现说明,并在组件框中输入 UI>Browser>WebAppInstalls

显示对 API 的支持

您是否打算使用标签页式应用模式?您的公开支持有助于 Chrome 团队确定功能优先级,并向其他浏览器供应商展示支持这些功能的重要性。

使用 #ChromiumDev 标签向 @ChromiumDev 发送推文,告诉我们您在何处以及如何使用它。#TabbedApplicationMode

致谢

Matt Giuca 探索了标签页式应用模式。Chrome 中的实验性实现由 Alan Cutter 完成。本文档已由 Joe Medley 审核。主打图片由 Till NiermannWikimedia Commons 上提供。