安装中的概念
同一源上的多个 PWA
发布于
同一个源可以用不同的清单提供多个独立安装的 Web 应用。用清单 id 标识应用身份,用 scope 划定各应用上下文的导航边界(Web Application Manifest,W3C)。
工作原理
链接到“工作原理”一节id 和 start_url 处理后都是 URL,两者同源。清单身份与已安装应用不匹配时,用户代理应将其视为独立应用;匹配时,则用新清单替换已安装应用的清单。id 缺失、为空、无效或跨源时,处理结果保持为处理后的 start_url(id 成员,W3C)。
scope 是另一个 URL。文档 URL 与 scope URL 同源,且文档路径以 scope 路径开头时,该文档位于范围内。scope 缺失、为空、无效或不包含 start_url 时,默认值是移除文件名、查询和片段后的 start_url(scope 成员,W3C)。
由于匹配使用路径前缀,"/sales" 也包含 /sales-report;要把边界限定在这个目录,使用 "/sales/"。两个应用的 scope 可以包含同一个 URL,但 scope 不负责标识已安装应用。应使用不同且稳定的 id 表示身份;若每个 URL 应只留在一个应用上下文内,则选择互不重叠的 scope 路径。
所引 BCD 数据集记录了 Chrome 从 96 起、macOS Safari 从 17 起以及 iOS Safari 从 16.4 起对 id 的支持。该文件中的 Edge 与 Samsung Internet 使用镜像数据,没有直接列出版本号。Firefox 会解析该成员但不会应用它(BCD manifests.webapp.id)。
销售应用和支持应用共用一个源时,为它们设置不同的身份与目录边界。
声明销售应用
链接到“声明销售应用”一节从用于安装销售应用的文档链接这份清单。
{ "name": "Acme Sales", "id": "/apps/sales", "start_url": "/sales/", "scope": "/sales/", "display": "standalone"}id 是标识符而不是导航目标,因此规范不要求它位于 scope 内。
声明支持应用
链接到“声明支持应用”一节支持应用的清单使用另一个身份和互不重叠的路径前缀。
{ "name": "Acme Support", "id": "/apps/support", "start_url": "/support/", "scope": "/support/", "display": "standalone"}在同一源内更改启动 URL 或清单 URL 时,也要保持两个 id 值稳定。
检测链接的清单并提供回退
链接到“检测链接的清单并提供回退”一节这项页面级检查不会复现用户代理对 id 或 scope 的处理。它检测浏览器是否报告支持 manifest 链接类型,以及当前文档是否声明了清单链接。任一检查失败时,继续提供普通网站导航。链接的 relList 是 DOMTokenList,其 supports() 方法报告是否支持指定 token(DOMTokenList.supports(),MDN)。rel~= 选择器会在 HTML 定义的空格分隔 rel token 中匹配 manifest。
const probe = document.createElement('link');const supportsManifestLink = typeof probe.relList?.supports === 'function' && probe.relList.supports('manifest');const manifestLink = document.querySelector('link[rel~="manifest"][href]');
if (!supportsManifestLink || !manifestLink) { document.documentElement.dataset.navigation = 'website';} else { document.documentElement.dataset.navigation = 'app-candidate'; console.info(`Linked manifest: ${manifestLink.href}`);}这项检查只确认文档是否声明了清单。它不表示浏览器会处理 id,也不表示应用已经安装或当前 URL 位于处理后的 scope 内。
另请参阅
链接到“另请参阅”一节id清单成员scope清单成员- N+1 安装问题
- Web Application Manifest:
idmember(W3C) - Web Application Manifest:
scopemember(W3C)
规范
| 规范 | 状态 |
|---|---|
| Web 应用清单:id | W3C |
- 图例
- 支持
- 部分支持
- 需开启标志
- 不支持
- 未知
| 浏览器 / 平台 | 支持 | 版本 | 置信度 | 来源 | 备注 |
|---|---|---|---|---|---|
| Chrome (Desktop)# | 支持 | 96 | 高 | 来源 | — |
| Chrome (Android)# | 支持 | 96 | 高 | 来源 | 1 |
| Edge (Desktop)# | 支持 | 96 | 高 | 来源 | 2 |
| Firefox (Desktop)# | 不支持 | — | 高 | 来源 | 3 |
| Firefox (Android)# | 不支持 | — | 高 | 来源 | 4 |
| Safari (macOS)# | 支持 | 17 | 高 | 来源 | — |
| Safari (iOS)# | 支持 | 16.4 | 高 | 来源 | — |
| Samsung Internet# | 支持 | 17.0 | 高 | 来源 | 5 |
| WebView (Android)# | 支持 | 96 | 高 | 来源 | 6 |
- 由 browser-compat-data 镜像自 Chrome 的数据推导。
- 由 browser-compat-data 镜像自 Chrome 的数据推导。
- 该属性可以解析,但没有任何效果。
- browser-compat-data 未记录 Firefox for Android 的支持。
- 由 browser-compat-data 镜像自 Chrome Android 的数据推导。
- 由 browser-compat-data 镜像自 Chrome Android 的数据推导。