Service Worker 与 PWA

共 32 题
📑 题目列表 32 题
#
★★★

1. PWA 与原生应用的能力差距对比

PWA 与原生应用的能力差距体现在哪些方面?现代 PWA 通过哪些机制缩小差距?

  • 安装、分发与发现的差异
  • 系统能力(推送、文件、支付)的覆盖
  • 性能、离线与更新模型

PWA 与原生应用的能力差距可从五维对比:分发与安装——PWA 无应用商店审核、链接即装(浏览器安装/商店分发),原生需商店分发与审核;系统能力——PWA 可用的推送、通知、角标、文件系统(OPFS/File System Access)逐步对齐,但深度能力(蓝牙 NFC 部分场景、后台保活、敏感传感器)仍受限;离线与性能——PWA 经 Service Worker 与缓存可完全离线启动,但长时后台任务与复杂后台执行弱于原生;更新模型——PWA 免安装更新(SW 静默更新),原生需商店发版(Play 可增量);体验——PWA 无启动占位、动画与手势与原生仍有差距,但通过 manifest 全屏显示、badging 与安装体验改善。现代 PWA 通过 Web App Manifest、SW 预缓存、Push、Badging、File Handling 等标准缩小差距,Google 的"PWABuddy"类评估与安装提示更推动其成为"接近原生"的交付形态;选型时按能力需求矩阵决定(高频系统能力依赖则原生,内容与服务导向则 PWA)。

回答用多维对比结构(分发、能力、离线、更新、体验)给出差距与缩小机制,最后落到按能力矩阵选型,避免武断结论。

#
★★★

2. Cache API/IndexedDB/OPFS 在 PWA 离线存储的工程取舍

Cache API、IndexedDB 与 OPFS 在 PWA 离线存储中各适合什么场景?如何取舍?

  • 三者存储模型的本质差异
  • 按数据类型(资源、结构化数据、大文件)选型
  • 配额与清理策略

三者存储模型不同:Cache API 面向"HTTP 请求-响应"的完整资源对(含头与元数据),天然服务 SW 离线缓存页面/静态资源/API 响应,按请求 URL 寻址;IndexedDB 是面向结构化数据的 NoSQL 事务型数据库(对象仓库、索引、游标),适合业务数据、离线队列、用户配置;OPFS(Origin Private File System)提供沙箱文件系统,支持高性能随机访问与流式读写大文件(音视频、数据库文件)。工程取舍:离线壳与资源用 Cache(配合策略);业务实体与查询用 IndexedDB;大文件与二进制流用 OPFS;三者共用同一 origin 配额(Storage Quota),需通过 navigator.storage.estimate 观测并做 LRU/过期清理。实践中常组合:Cache 管资源、IndexedDB 管数据、OPFS 管媒体,按"数据形态"而非"功能"选型,并统一封装存储层便于替换。

回答按"三种存储的模型本质 → 数据形态匹配 → 配额与清理 → 组合实践"组织,核心是"按数据形态选存储"。

#
★★★

3. Service Worker 的 updateViaCache 与浏览器 SW 缓存层级

Service Worker 的 updateViaCache 如何影响更新?浏览器对 SW 脚本的缓存层级是怎样的?

  • SW 更新检查的触发与 HTTP 缓存
  • updateViaCache 的三种取值
  • 缓存层级(HTTP 缓存 vs SW 缓存)的交互

浏览器更新 SW 时先请求其脚本,默认可能被 HTTP 缓存命中导致拿到旧脚本,updateViaCache 控制这一层:'imports'(默认,只绕过主脚本的缓存、importScripts 走缓存)、'all'(主脚本与 imports 都走 HTTP 缓存)、'none'(都不走,每次网络获取)。缓存层级交互:SW 脚本本身的更新走"HTTP 缓存 + 24h 强制检查"(浏览器每天至少检查一次,导航与更新触发时检查);SW 安装后的资源缓存(Cache API)是第二层,由开发者控制;fetch 事件里 SW 的响应优先级(先 Cache 后网络等)是第三层。工程要点:生产应设 updateViaCache: 'none' 或用短缓存头保证新 SW 及时下发;但"新 SW 拿到"不等于"立即生效",需配合 skipWaiting/提示策略控制激活时机;更新检查与版本号(build 哈希注入 URL)结合可绕开 HTTP 缓存不确定性。

回答按"更新检查机制 → updateViaCache 取值 → 三层缓存交互 → 工程配置"组织,突出"脚本更新与激活是两个阶段"。

#
★★★

4. Service Worker 生命周期(install、activate、fetch、message、sync、push)

Service Worker 的生命周期事件有哪些?各事件的职责与触发时机是什么?

  • install/activate 的安装激活流程
  • fetch/message 的运行时事件
  • sync/push 的后台事件

SW 生命周期分安装期与运行期:install——首次安装或新版本安装时触发(仅一次),用于预缓存静态资源(event.waitUntil 保证完成后才完成安装),失败则本次安装废弃;activate——安装成功后旧 SW 被替换时触发,用于清理旧缓存、接管控制(clients.claim 立即接管,否则首次加载由旧版控制);fetch——拦截页面所有请求,按缓存策略返回(网络/缓存/后台同步等);message——接收页面 postMessage(UI 与 SW 通信,用于手动触发更新、同步命令);sync——后台同步事件,网络恢复时触发已注册的同步任务(配合 IndexedDB 重放离线操作);push——服务端推送到达时触发,需在事件内展示通知(或 Data 通知转发),处理完需调用事件完成信号。工程要点:install 里 waitUntil 的预缓存失败重试策略、activate 里缓存版本化清理、fetch 里区分导航/资源/API 不同策略、push 事件里权限与点击导航闭环。

回答按"安装期(install/activate)→ 运行期(fetch/message)→ 后台期(sync/push)"分组讲职责与时机,再给工程要点,结构清晰。

#
★★★

5. navigator.storage.persist() 与存储配额驱逐策略,持久化存储申请与浏览器决策机制

navigator.storage.persist() 如何申请持久化存储?浏览器的配额与驱逐策略是怎样的?

  • 存储持久化的意义(免驱逐)
  • persist() 的调用时机与浏览器决策
  • 配额估计与剩余空间的观测

浏览器存储默认可被驱逐(空间不足时按 LRU 清除 origin 数据,SW 缓存、IndexedDB 皆可能被清),navigator.storage.persist() 申请"持久化"状态:获批后 origin 数据免除自动驱逐(用户仍可手动清除),页面关闭后仍保留。浏览器决策机制:Chrome 依据用户参与度(安装 PWA、频繁使用、权限授予、书签)综合评分自动决定是否批准(persisted 属性可查,无需强交互时调用);Safari 的 Web App 安装后默认持久;Firefox 通过用户设置控制。工程要点:在关键时机(安装后、用户授权后)调用 persist() 并查询 navigator.storage.persisted() 结果;用 navigator.storage.estimate() 观测使用量与配额(quota 通常为磁盘可用空间的百分比,Chrome 约 60% 可用空间的 50% 上限逻辑);持久化失败时给出提示并主动做数据清理降级(淘汰旧缓存、压缩数据)。注意持久化不改变配额上限,只是免驱逐。

回答按"驱逐问题 → persist 机制与决策依据 → 观测与降级"组织,强调"持久化免驱逐但配额不变"的准确边界。

#
★★★

6. PWA Manifest(含 id/scope/start_url)

PWA Manifest 的核心字段有哪些?id、scope 与 start_url 的作用与关系是什么?

  • manifest 的声明与加载
  • id/scope/start_url 的语义
  • 安装判定与唯一标识

Manifest 是 PWA 的安装描述文件(JSON,link 引入):name/short_name 定义应用名(安装与展示),icons 提供多尺寸图标,theme_color/background_color 控制 UI 与启动屏,display 定义展示模式(standalone/fullscreen/minimal-ui),start_url 定义安装后启动的入口 URL(默认当前页),scope 定义应用管辖范围(可导航的 URL 边界,超出视为站外),id 定义应用的唯一标识(默认基于 start_url 解析,安装记录、更新匹配都以 id 为准,改名/换域名不丢安装身份)。关系与注意点:start_url 必须在 scope 内;scope 默认以 manifest 所在目录为界,可用 ./ 显式限定;id 建议显式指定稳定值(如相对 URL),避免路径变化导致"重新安装";manifest 需与 SW(离线)与 HTTPS(安全上下文)配合才满足可安装性,Chrome 要求 icons 含 192/512 等规格。

回答按"字段分组 → 三核心字段语义 → 安装判定与注意点"组织,突出 id 对"安装身份"的决定作用。

#
★★★

7. beforeinstallprompt 事件与自定义安装按钮

beforeinstallprompt 事件如何实现自定义安装按钮?与浏览器默认安装提示如何配合?

  • 事件触发条件与暂停默认 UI
  • 自定义按钮的安装流程(prompt/userChoice)
  • 触发时机与转化优化

beforeinstallprompt(Chrome 系)在满足可安装性(HTTPS、SW、Manifest 合规、参与度)时触发,preventDefault() 可暂停浏览器默认安装 UI,保存 event 供后续自定义触发;用户点击自定义"安装"按钮时调用 savedPrompt.prompt() 弹出原生安装对话框,通过 userChoice 结果判断安装/取消,安装完成监听 appinstalled。工程要点:事件触发时机不可控(可能早于用户准备),通常保存后按 UX 时机(首次交互、停留时长、滚动深度)展示自定义按钮;安装后隐藏按钮(appinstalled)并避免重复提示;iOS Safari 无 beforeinstallprompt,需降级为"添加到主屏幕"引导(分步指引);统计漏斗(展示率、点击率、完成率)评估转化;注意 prompt() 只能调用一次且需用户手势触发。自定义按钮的价值在于"把安装入口融入产品体验"而非被动等待浏览器提示。

回答按"事件机制(preventDefault+保存)→ 自定义流程(prompt/userChoice)→ UX 时机与降级 → 数据漏斗"组织。

#
★★★

8. Background Sync 的 SyncManager.register 与 IndexedDB 的协作取舍

Background Sync 如何与 IndexedDB 协作实现离线数据同步?两者的取舍是什么?

  • sync 事件注册与触发条件
  • 离线队列的存储与重放
  • 一次性 vs 周期同步的取舍

Background Sync 让应用在离线期间把"待发送请求"注册为同步任务:离线时请求先写入 IndexedDB(离线队列),navigator.sync.register('tag') 注册任务;网络恢复后 SW 的 sync 事件触发,读取队列重放请求,成功删除、失败重试(浏览器对失败有限制与退避)。协作模型:IndexedDB 负责"可靠存储",SyncManager 负责"时机触发",两者配合实现"先存后发"的离线优先写路径。取舍:一次性同步(One-off Sync,register)适合"单个或有限请求"(表单提交、单条记录),浏览器按网络状态尽快触发;Periodic Background Sync(periodicSync)适合"定期拉取"(日报、行情),但受站点参与度与浏览器策略限制、不可靠,需降级为运行时拉取;重放需幂等设计(请求带 id、服务端去重)与冲突处理(版本/时间戳)。工程上把"离线写入"与"同步重放"封装为统一同步层,观测队列积压与同步成功率。

回答按"机制(存队列+注册触发)→ 协作关系 → 两类同步取舍 → 幂等与观测"组织,突出"存储与时机分离"的设计。

#
★★★

9. iOS Safari 的 PWA 安装限制与 apple-touch-icon 的兼容性

iOS Safari 对 PWA 有哪些安装限制?apple-touch-icon 的作用与兼容性要点是什么?

  • iOS 无 beforeinstallprompt 的安装路径
  • apple-touch-icon 与主屏图标
  • 独立模式、推送与持久化的 iOS 差异

iOS Safari 不支持 beforeinstallprompt,安装只能通过"添加到主屏幕"(手动或引导);可安装性判定宽松(无 SW 强要求,但完整 PWA 仍需 manifest 与 SW 才能获得独立模式与推送)。apple-touch-icon 是 iOS 专用的主屏图标声明(link rel="apple-touch-icon"),iOS 不用 manifest 的 icons 作为主屏图标(14+ 部分支持 maskable 处理仍建议双声明),且默认给截图加高光/圆角,非透明 PNG 才免处理;建议提供 180x180(当前主流)及以上多尺寸。其他 iOS 差异:standalone 需 manifest 且用户主动添加;Web Push 需 16.4+ 且必须"添加到主屏幕"才支持;存储持久化在安装后默认;启动屏用 apple-touch-startup-image(已弃用,iOS 15+ 自动截图)与 background_color 控制。工程要点:同时提供 manifest icons 与 apple-touch-icon;引导流程检测 iOS 与是否已安装(display-mode: standalone 媒体查询);测试真机 Safari 各版本。

回答按"安装路径差异 → apple-touch-icon 机制 → iOS 能力差异清单 → 工程适配"组织,突出 iOS 特有的兼容矩阵。

#
★★★

10. Notifications API 在现代 PWA 与 Native App 的工程取舍

Notifications API 在 PWA 中如何工作?与 Native App 推送在工程上有何取舍?

  • Web Push + Notification 的完整链路
  • 权限、订阅与展示的生命周期
  • 与原生推送的体验差异

PWA 通知链路:页面申请 Notification 权限 → SW 通过 PushManager.subscribe(VAPID)订阅 → 服务端推送经推送服务到达 → SW 的 push 事件内 showNotification 展示(含 data 与 actions),点击通知触发 notificationclick 导航到对应页面。工程取舍对比 Native:到达率与可靠性——Web Push 受浏览器策略(Chrome 的 silent push 治理、权限控制)与平台限制,Native 推送(APNs/FCM)更稳定且支持离线持久送达;能力——Web 通知支持 actions/图片/角标联动(Badging),但系统级深度(锁屏样式、免打扰策略联动)弱于原生;成本——PWA 无需应用商店与原生 SDK,推送链路轻。工程要点:权限申请时机(用户手势后,提升转化);订阅管理(pushsubscriptionchange 续订、失效清理);通知去重与内容安全(防滥用被浏览器降权);本地通知(定时器触发)在 PWA 中受后台限制,长定时需服务端配合。选型:内容提醒类可 PWA 覆盖,强时效与高保真推送场景补原生壳。

回答按"链路机制 → 与原生对比(可靠性/能力/成本)→ 工程要点与选型"组织,突出订阅生命周期与浏览器治理风险。

#
★★

11. Workbox(Google 的 SW 库)在缓存策略预设与路由生成的工程价值

Workbox 如何简化 Service Worker 开发?缓存策略预设与路由生成的工程价值是什么?

  • Workbox 的模块化能力(策略、路由、插件)
  • 预缓存与运行时缓存的生成
  • 与构建工具链的集成

Workbox 是 SW 开发的生产级库,工程价值:策略预设——StaleWhileRevalidate(更新时返回旧值,适合静态资源)、CacheFirst(资源强缓存,适合构建产物)、NetworkFirst(网络优先,适合导航/API)、NetworkOnly 等,避免手写 fetch 分支逻辑;路由生成——用正则/函数匹配 URL 并绑定策略(页面导航、图片、API 分开治理);预缓存——workbox-precaching 构建期生成资源清单(URL+哈希),install 时预缓存、activate 时清理旧版本,配合 revision 解决"文件名不变内容变"的更新问题;插件体系(ExpirationPlugin 过期清理、CacheableResponsePlugin 校验可缓存响应、BackgroundSyncPlugin 离线重放)覆盖缓存治理细节。与构建集成:workbox-webpack-plugin(GenerateSW/InjectManifest)与 vite-plugin-pwa 在构建产物中自动注入 SW 与清单。价值本质是把"正确但繁琐"的 SW 工程细节(版本化、清理、策略组合)标准化,减少自研出错面。

回答按"策略预设 → 路由与预缓存 → 插件治理 → 构建集成"组织,突出"清单版本化"与"策略组合"两个核心机制。

#
★★

12. Service Worker 更新策略(skipWaiting、clients.claim、UI 提示)

Service Worker 的更新策略如何设计?skipWaiting、clients.claim 与 UI 提示如何配合?

  • 更新检查与新 SW 的等待态
  • skipWaiting 与 clients.claim 的作用
  • 强制更新与提示更新的取舍

浏览器检查到新 SW 后默认进入"waiting"态:等所有旧 SW 控制的页面关闭才接管,避免新旧版本混跑。更新策略分三档:静默更新——注册时 skipWaiting() + activate 时 clients.claim(),新 SW 立即接管所有页面,适合无状态资源型应用(静态壳更新),风险是用户正在使用的会话被新代码打断;提示更新——检测到 waiting(registration.waiting)后经页面 postMessage 询问"刷新更新",用户确认后调用 skipWaiting + reload,体验可控但需 UI 与状态管理;强制更新——关键版本(安全修复)跳过提示直接更新并 reload,适合强一致需求。工程要点:资源缓存版本化(版本号命名空间)保证新旧 SW 缓存不串;registration.update() 手动触发检查时机;UI 提示需防重复打扰(本地标记);多标签页场景下提示更新需广播到其他页面协同刷新。

回答按"更新状态机 → 三档策略与适用场景 → 版本化与多标签协同"组织,核心是"何时接管"的产品决策。

#
★★

13. Cache API 中 response.clone() 与流式缓存的限制,流式响应的缓存方案与 workaround

Cache API 对流式响应有哪些限制?response.clone() 的作用与流式缓存的工作区方案是什么?

  • 响应体只能消费一次的特性
  • clone() 与流式响应的冲突
  • 流式缓存(挂起响应、分片)的工程方案

响应体(body)是流,只能消费一次:fetch 拿到 response 后若同时要"给页面"与"写入缓存",直接操作会报错或丢体,标准做法是 clone() 出一份独立副本分别消费;但 clone() 对流式响应同样有限制——流的副本会缓冲整个体(失去流式增量),大响应与长连接(SSE、媒体)缓冲导致内存与首字节延迟问题。流式缓存方案:Cache API 支持挂起响应(pending response,通过 ReadableStream 构造后 put),把"读取响应"与"写入缓存"同时进行:用 response.body 的流做 tee 分叉(一个流给页面、一个流写入 Cache),实现边下载边缓存;Workbox 用 streams 策略(如 workbox-streams)组合多段流;注意点:tee 的流需同时消费,否则背压阻塞;部分浏览器(Safari 旧版)对流式 put 支持不佳需回退为整体缓存;流式缓存与 CacheFirst 的"先校验再使用"顺序需权衡(流已消耗则无法再回退)。工程上按"响应体大小 × 缓存必要性"决定是否流式。

回答按"单次消费约束 → clone 的流限制 → tee 分叉的流式方案 → 兼容回退"组织,突出流语义与缓存语义的冲突本质。

#
★★

14. Service Worker 缓存与 HTTP 磁盘缓存的优先级关系,fetch 事件拦截与浏览器缓存层级的交互

Service Worker 缓存与 HTTP 磁盘缓存是什么关系?fetch 事件拦截如何与浏览器缓存层级交互?

  • 请求经过的缓存层级顺序
  • SW fetch 内手动走 HTTP 缓存的用法
  • 层级交互的工程陷阱

请求处理存在多层缓存:内存/磁盘 HTTP 缓存(浏览器按 Cache-Control 管理)→ SW(fetch 事件在 HTTP 缓存之前介入)→ 网络。SW fetch 事件拦截发生在"HTTP 缓存命中之前":SW 先决定是否响应(Cache API 或 fetch 网络),fetch() 发起时才轮到 HTTP 缓存逻辑。层级交互的工程要点:SW 想"绕过 HTTP 缓存"时给 fetch 传 {cache: 'no-store'};想"复用 HTTP 缓存"(如 API 长缓存)则默认或 cache: 'default';导航请求预检(navigation preload)可并行化 SW 启动与网络,减少首字节延迟;陷阱:SW 缓存与 HTTP 缓存双重缓存导致"以为更新了其实旧"(需版本化与失效策略);Cache-Control 与 SW 策略打架(HTTP 缓存的 no-store 仍可被 SW Cache 缓存,需理解各自管辖);DevTools 的 Network 面板区分"from ServiceWorker"与"from memory/disk cache"便于验证层级。

回答按"缓存层级顺序 → fetch 介入点与 cache 选项 → 预检与陷阱"组织,核心是"SW 在 HTTP 缓存之前,两层独立管辖"。

#
★★

15. BroadcastChannel/clients.claim 在多 SW 客户端通信的工程价值

BroadcastChannel 与 clients.claim 在多客户端场景下如何协作?工程价值是什么?

  • BroadcastChannel 的页面间通信机制
  • clients.claim 的立即接管
  • 多标签页状态一致的治理

BroadcastChannel 是同源上下文间(页面/Worker)的广播通道:多标签页可互发消息实现状态同步(登录态、主题、数据变更通知),无需服务端中转;SW 也可用 BroadcastChannel 向页面广播事件(如缓存更新完成、推送到达),页面监听刷新。clients.claim() 让新激活的 SW 立即接管所有同源页面(包括激活前加载的),配合 skipWaiting 实现"新版本立即对所有标签生效"。两者的工程协作:SW 更新或数据变更时,SW 通过 BroadcastChannel 广播"版本已更新/缓存已就绪",各标签页监听后协同刷新(单个刷新避免多标签同时请求);页面间通过 BroadcastChannel 维持"单一活跃会话"(如只允许一个编辑页)。工程价值:多标签一致性、SW 与页面的解耦通信、避免各自为政的状态漂移;注意通道命名规范、消息协议版本化与监听清理。

回答按"两机制各自职责 → 协作模式 → 一致性收益 → 规范注意点"组织,突出"广播 + 接管"的组合使用场景。

#
★★

16. workbox-webpack-plugin/vite-plugin-pwa 在构建产物注入 SW 的工程价值

workbox-webpack-plugin 与 vite-plugin-pwa 如何在构建时注入 SW?工程价值是什么?

  • GenerateSW 与 InjectManifest 两种模式
  • 资源清单(precache manifest)的自动生成
  • 构建产物与 SW 的版本绑定

两个插件在构建期把 SW 工程化:workbox-webpack-plugin 的 GenerateSW 模式根据 webpack 产物自动生成 SW(预缓存清单含文件哈希、运行时缓存路由配置),InjectManifest 模式把开发者手写的 SW 模板与自动生成清单合并(适合精细控制);vite-plugin-pwa 类似,基于 Workbox 生成 SW 并注入到构建产物,还提供 manifest 生成、图标处理、虚拟模块(注册代码自动注入)等。工程价值:清单自动生成且与构建产物哈希绑定——文件变化时 revision 更新,SW 更新时自动清理旧缓存,杜绝"手写清单过期";注册代码与构建配置解耦(dev 模式可禁用);多页/SPA 的导航回退(fallback)自动配置。注意点:GenerateSW 生成的 SW 逻辑固定,定制强需 InjectManifest;注入的注册脚本需与更新策略(提示/静默)配合;产物在 CI 与本地构建间的一致性(哈希差异导致无谓更新)。

回答按"两种模式机制 → 清单自动生成与哈希绑定 → 与构建/更新策略集成"组织,核心价值是"构建期保证缓存清单与产物一致"。

#
★★

17. Background Fetch API(window.BackgroundFetchManager)在大文件下载的应用

Background Fetch API 如何用于大文件下载?与 SW fetch、普通下载有何区别?

  • Background Fetch 的机制与生命周期
  • 下载进度与用户可见 UI
  • 与流式缓存、普通下载的取舍

Background Fetch 是浏览器级大文件下载 API:页面调用 registration.backgroundFetch.fetch(id, requests, options) 后,下载由浏览器接管(进程被杀也继续),进度在系统级 UI 可见(下载条与图标角标),完成/失败通过事件(progress、success、fail)通知 SW 与页面。区别于普通 fetch:不受 SW 生命周期与页面可见性限制、持久下载、用户可取消可见;区别于 SW 内 fetch 流式缓存:Background Fetch 面向"一次性下载到磁盘缓存"而非流式消费,下载完成后可把响应写入 Cache API。工程价值:适合安装包、离线媒体、数据包等大文件下载场景,解决"页面关掉下载断"的痛点;限制:需安全上下文、Chrome 系支持为主(Safari/Firefox 支持不足需降级为 SW 内流式下载);下载有大小与数量限制(不同浏览器配额)、用户可随时取消与暂停(API 无官方暂停恢复,需自行分片)。工程要点:用 progress 事件更新 UI、失败重试策略、与 IndexedDB 记录任务状态。

回答按"机制(浏览器接管+可见进度)→ 对比普通下载与 SW 流式 → 场景与限制 → 工程治理"组织,突出"用户可见持久下载"的定位。

#
★★

18. Service Worker 调试与 Chrome DevTools Application 面板

如何使用 Chrome DevTools 调试 Service Worker?Application 面板的工程价值是什么?

  • Application 面板的 SW 生命周期控制
  • 缓存存储与 Manifest 检查
  • 更新调试与离线模拟

Chrome DevTools 的 Application 面板是 SW/PWA 调试主阵地:Service Workers 区展示注册列表、运行状态(running/stopped),提供 Update(触发更新检查)、Unregister(注销)、Start/Stop 控制,并支持"Update on reload"(每次刷新强制更新便于开发迭代)、Bypass for network(跳过 SW 直连网络)等开关;Storage 区可查看 Cache Storage(逐条响应体)、IndexedDB、存储配额与清空;Manifest 区校验可安装性字段。工程价值:把"生命周期与缓存"可视化——定位"为什么没更新"(检查 waiting/active 状态与 updateViaCache)、"为什么缓存了旧内容"(查看 Cache 内容与哈希)、验证离线行为(Network 面板 Offline + Bypass 组合模拟首次/二次访问);配合 Sources 面板在 SW 脚本打断点调试 install/fetch 逻辑。团队实践:把"更新/缓存/离线"三类常见问题固化为基于面板的排查清单。

回答按"面板功能地图 → 生命周期调试 → 缓存与离线验证 → 排查清单化"组织,体现"可视化调试替代黑盒猜测"。

#
★★

19. SW 更新灰度与多版本客户端共存问题,skipWaiting 策略与客户端版本兼容性管理

SW 更新如何灰度?多版本客户端共存时如何管理版本兼容性?

  • 灰度手段(服务端按条件下发新资源)
  • 多版本共存的兼容矩阵
  • skipWaiting 与版本协商策略

SW 更新灰度:SW 脚本与资源的更新由浏览器统一检查,灰度需服务端配合——按用户条件(地区、比例、账号)下发不同版本的 SW 脚本与静态资源(服务端用 Vary/条件响应区分),而非客户端自选;缓存资源用"版本命名空间"(/v1/、/v2/)并行部署,避免新旧混用。多版本共存的兼容问题:skipWaiting + clients.claim 后新旧页面可能同时存在(旧页面缓存旧资源、新页面用新资源),若新旧资源依赖的 API 契约不同则页面报错;治理:API 版本化(路径或 header 版本)、资源与页面版本绑定(HTML 入口引用带版本号的资源)、SW 内做版本协商(读取页面标记决定用哪套缓存命名空间)、灰度观察(错误率、白屏率)决定放量或回滚。策略取舍:静默更新适合纯前端资源(契约稳定);契约变化的版本需"提示刷新"过渡(旧页面引导刷新后再切换),避免强制接管导致旧页面异常。

回答按"灰度机制 → 版本命名空间 → 契约兼容矩阵 → 策略取舍"组织,核心是"缓存版本化 + API 契约兼容"双保险。

#
★★

20. Web App Manifest 的 name、short_name、icons 在安装体验的工程价值

Manifest 的 name、short_name 与 icons 如何影响安装体验?工程配置要点是什么?

  • 两名称的展示场景差异
  • icons 的多尺寸与 maskable 适配
  • 安装入口与图标质量治理

name 是应用全称(应用商店、首次安装对话框),short_name 是空间受限场景的短名(主屏、启动器、角标气泡),二者都必填且长度需适配(short_name 建议 12 字符内);icons 决定安装后图标与启动屏:Chrome 可安装性要求至少 192px 与 512px 图标,各尺寸按密度声明;maskable 类型图标带安全区(safe zone)适配系统形状(圆形、圆角矩形)裁剪,非 maskable 图标在系统裁剪时边缘易被切;purpose: 'any maskable' 组合声明。工程价值:名称与图标是安装"第一印象"与转化关键——图标模糊/被裁、名称截断直接降低安装意愿与品牌识别;实践:icon 生成流水线(多尺寸 + maskable 安全区 + 平台预览)、按平台(iOS apple-touch-icon 另配)验证、安装后启动屏(background_color 与图标组合)一致性检查,避免"安装前好看、安装后走样"。

回答按"字段语义 → 图标规格与 maskable → 转化与一致性治理"组织,突出图标"安全区"与"多平台预览"两个易漏点。

#
★★

21. Web App Manifest 的 theme_color 与 background_color 在浏览器 UI 适配的现代应用

Manifest 的 theme_color 与 background_color 如何影响浏览器 UI 适配?工程价值是什么?

  • theme_color 的作用范围(工具栏、地址栏)
  • background_color 与启动屏
  • 与页面 CSS 的一致性治理

theme_color 定义应用主题色:安装后影响窗口标题栏、工具栏与移动端地址栏颜色(浏览器按此着色),使 PWA 外观与品牌一致;background_color 定义启动屏(splash screen)背景色——启动时在资源加载前显示该颜色(配合图标构成启动画面),与页面首帧 background 一致可减少"白屏闪烁"。现代应用:theme_color 支持 media 查询做深色模式分支(浅色/深色各自声明);theme_color 与 CSS(如 meta theme-color 与页面内主题变量)需保持同步,主题切换(如设置里换肤)时用 meta 更新而非依赖重启;background_color 应取页面首帧背景(而非花哨色),避免启动闪色。工程价值:两者是"应用质感"的细节杠杆——正确配置让启动与运行无缝衔接,错误配置(背景色与页面底色不符)直接暴露启动瑕疵;用 Lighthouse 与真机安装验证启动屏与实际首帧一致性。

回答按"两字段各自作用 → 深浅色与页面同步 → 启动一致性治理"组织,突出"启动无缝"这一体验目标。

#
★★

22. Web App Manifest 的 id(替代 start_url)在 PWA 唯一标识的工程实践

Manifest 的 id 字段如何作为 PWA 的唯一标识?与 start_url 的关系及工程实践是什么?

  • id 的解析规则与默认值
  • 安装身份与更新的匹配机制
  • 稳定 id 的工程治理

manifest 的 id 是应用的安装唯一标识:浏览器以此识别"同一个应用"——安装记录、安装状态、更新推送(如 Web Install API)都以 id 为准;未声明时默认按 start_url 解析(同源 + 路径限定)。与 start_url 的关系:start_url 是"启动入口"(每次打开去的页面),id 是"身份"(应用是谁);改名 start_url 或域名迁移时,显式稳定的 id 可保持"已安装应用不被当作新应用"(避免重复安装、丢失推送与角标关联)。工程实践:显式声明稳定 id(建议固定相对 URL 或标识字符串),不随部署路径变化;id 变更视为"换应用"需评估对已安装用户的影响(旧安装失效或重复出现);与 manifest 其他字段(scope)保持一致性校验;多环境(staging/prod)用不同 id 隔离安装身份,避免测试环境污染生产安装记录。配套用 DevTools 检查解析后的 id 值。

回答按"id 语义与默认规则 → 与 start_url 的分工 → 稳定性工程治理"组织,核心是"身份与入口分离"。

#
★★

23. Web App Manifest 的 categories、screenshots 在应用商店展示的现代应用

Manifest 的 categories 与 screenshots 如何用于应用商店展示?工程实践是什么?

  • categories 的品类声明与商店归类
  • screenshots 的规格与多设备展示
  • 商店发布(Chrome Web Store/PWA 目录)的合规

categories 声明应用所属品类(官方受控枚举,如 productivity、games),帮助应用商店与系统目录归类检索;screenshots 提供应用界面截图(可含 form_factor 声明 wide/mobile 适配横屏设备展示),商店(Chrome Web Store、Windows Store、Play 的 PWA 上架)以截图与描述构成"商店卡片"。工程实践:categories 选官方枚举(自定义值被忽略);screenshots 用真实界面(非占位图)、尺寸与纵横比按商店规范(建议 1280x800 或手机 640x320 等)、多设备(手机/平板)各提供;截图像素与体积控制(商店压缩);与商店上架流程配合:Store 要求额外素材(图标、宣传图)与隐私政策、权限说明;发布后验证商店页渲染效果(截图裁剪、文字截断)。价值:提升商店转化率——截图是用户第一信息来源;同时商店校验失败(缺字段、尺寸不符)会阻断发布,需按各商店规则矩阵准备素材。

回答按"字段作用 → 素材规格 → 商店合规流程"组织,突出"多商店素材矩阵"与"真实截图"两个实践要点。

#
★★

24. Web App Manifest 的 shortcuts 在长按图标的快捷操作的工程价值

Manifest 的 shortcuts 如何实现长按图标快捷操作?工程实现与注意点是什么?

  • shortcuts 的字段结构与触发行为
  • 快捷操作到页面路由的映射
  • 平台支持差异与降级

shortcuts 声明应用图标的快捷操作(长按/右键弹出菜单项):每项含 name(菜单文案)、short_name、url(点击打开的入口,需在 scope 内)、icons(可选);触发时浏览器以对应 URL 启动应用(新窗口/聚焦已有实例并导航,浏览器实现有差异)。工程价值:把高频动作(新建、搜索、最近使用)前置到系统菜单,提升可达性(类似原生 App 的 3D Touch/长按菜单)。实现要点:URL 带参数(如 ?action=new)在应用内路由解析并直达对应界面;菜单项文案与图标贴合平台规范(macOS Dock/Windows 任务栏/Android 长按的呈现差异);shortcuts 数量建议 4 个以内(平台菜单空间有限);导航前校验权限与登录态(未登录先跳登录再回跳);多窗口场景注意"聚焦已有窗口还是新开"的产品决策。降级:不支持 shortcuts 的平台(部分浏览器/OS)静默忽略,不阻塞安装;用原生平台能力(Windows JumpList 可选)增强。

回答按"字段与触发 → 路由直达实现 → 平台差异与降级"组织,突出"快捷入口到应用内路由"的衔接设计。

#
★★

25. Web App Manifest 的 file_handlers 与 launch_handler 在文件关联的工程应用

Manifest 的 file_handlers 与 launch_handler 如何实现文件关联?工程应用与边界是什么?

  • file_handlers 声明可处理的文件类型
  • launch_handler 控制启动行为(client_mode)
  • 文件打开流程与安全校验

file_handlers 让已安装 PWA 声明可处理的文件扩展名与 MIME(如 .docx、image/*),用户在系统文件管理器"打开方式"选择该应用后,系统把文件路径通过 launch queue 交给应用(PWA 获得 File System Access 句柄);launch_handler 的 client_mode 控制启动行为(navigate-new 新开窗口、navigate-existing 复用已有、focus-existing 聚焦并接管)。工程应用:文档/图片/音视频编辑类应用实现"双击打开"的桌面级体验。实现要点:file_handlers 的 action 接收 POST 请求(含文件句柄);在 launchQueue 中消费启动参数解析文件;安全上文件来源不可信(校验类型、大小、权限),编辑前确认或沙箱读取;client_mode 多窗口策略(每文件新窗口 vs 复用)影响状态管理;兼容性:Chrome 系支持为主,Safari/Firefox 不支持需在应用内提供"导入文件"降级入口。边界:file_handlers 是"打开关联"而非"默认应用接管"(OS 层默认关联设置另有机制)。

回答按"两字段机制 → 打开流程(launchQueue)→ 安全与窗口策略 → 兼容降级"组织,突出"声明-接收-消费"链路。

#
★★

26. Web App Manifest 的 protocol_handlers(web+something:)的现代应用

Manifest 的 protocol_handlers 如何注册自定义协议?现代应用场景与注意点是什么?

  • protocol_handlers 的声明与注册流程
  • 协议链接的解析与路由
  • 安全与平台支持

protocol_handlers 允许 PWA 注册自定义协议(如 web+myapp://):manifest 声明 protocol 与 url(带 %s 占位符接收参数),用户确认后浏览器把匹配协议的链接交给应用打开(系统"允许打开"授权)。现代应用:OAuth 回调(应用内授权后跳回)、外部系统唤起(邮件/消息中的 myapp://open?id=x)、扫码与短链直达。实现要点:url 模板用 %s 替换完整链接,应用侧解析协议参数(校验来源、协议白名单、防伪造链接诱导)后路由;注册需用户授权且受浏览器策略限制(Chrome 需用户手势或安装后行为),未授权时链接在浏览器内处理(显示提示页);与系统级协议注册(原生应用的 URL scheme)并存时,浏览器询问"用 PWA 还是系统应用打开"。注意:协议名必须 web+ 前缀(保留命名空间)、避免与系统协议冲突;安全上协议链接可被恶意构造,参数必须校验并限制可导航目标。

回答按"注册机制 → 模板解析与路由 → 授权与安全 → 与原生协议并存"组织,突出 %s 模板与来源校验两个要点。

#

27. Web App Manifest 的 share_target 接收分享数据的工程实践

Manifest 的 share_target 如何让 PWA 接收系统分享?工程实现与注意点是什么?

  • share_target 的声明与 POST/GET 提交
  • 分享数据的解析与展示
  • 与 Web Share API 的发送闭环

share_target 声明应用可接收系统分享:用户在系统分享面板选择该 PWA 后,系统把分享内容(text、url、files)以 POST(或 GET)提交到声明 url,应用页面解析后展示/处理。实现要点:POST 方式用 form 字段接收(text 文本、url 链接、files 文件数组),页面在加载时读取并渲染(如"分享到记事本"存入 IndexedDB);GET 适合纯文本链接分享;files 需声明接受的类型(accept)与多文件支持;分享入口需登录态与去重(重复分享同一内容标识 id)。工程价值:把 PWA 纳入系统分享生态(图片收藏、链接稍后读、剪贴板管理),形成"Web Share 发送 + Share Target 接收"闭环。注意点:share_target 页面是独立入口(非主入口),需适配无 UI 框架的裸加载场景(轻量路由);接收的文件存于临时权限,需及时处理;兼容性:Chrome 系为主,Safari 不支持(iOS 16+ 部分版本开始支持,需能力检测降级)。

回答按"声明与提交机制 → 数据解析与处理 → 与发送侧闭环 → 兼容降级"组织,突出"轻量接收页"与"临时文件及时处理"。

#

28. Web App Manifest 的 edge_side_panel 与 tabbed 的现代应用

Manifest 的 edge_side_panel 与 tabbed display 模式是什么?现代应用场景有哪些?

  • edge_side_panel 的侧边栏形态
  • tabbed 模式的标签页化窗口
  • 新形态的工程适配与支持现状

两者是 PWA 的新显示形态:edge_side_panel(Edge 扩展的 PWA 侧边栏能力)让应用以侧边栏形式停靠在浏览器边缘常驻(适合工具类:翻译、笔记、AI 助手、快捷搜索),需 Edge 的 PWA 侧边栏接口配合;tabbed display 让 PWA 窗口内呈现浏览器式标签页 UI(多页面应用在单窗口内 Tab 化切换,如邮件客户端、后台管理),通过 manifest 的 display_override: ['tabbed'] 与 tab_strip 配置(默认显示现有 tabstrip)。工程适配:tabbed 模式下应用自身路由与系统 Tab 的关系(每 Tab 一个页面实例,状态按 Tab 隔离)、侧边栏形态的窄屏布局适配(响应式断点)与常驻能力(后台行为);支持现状:均为新兴特性(Chromium 系实验/部分默认,Edge 侧边栏需特定版本),需特性检测与降级(无支持时回退 standalone)。价值:让 PWA 适配"浏览器内嵌"与"多页工作流"两类新场景,扩大桌面应用形态的表达力。

回答按"两形态机制 → 适配要点 → 支持现状与降级"组织,突出"新形态需特性检测 + 布局适配"。

#

29. PWA 安装后的离线启动与冷启动在不同设备的工程应用

PWA 安装后的离线启动与冷启动在不同设备上有哪些工程应用与差异?

  • 离线启动的缓存保障(导航预缓存)
  • 冷启动的资源加载顺序
  • 设备差异(iOS/Android/桌面)的启动行为

安装后的启动分两种:离线启动——断网状态下用户从主屏/启动器打开应用,需 SW 在 install 时预缓存导航入口(HTML 与核心资源)与运行时缓存策略兜底(NetworkFirst 降级 CacheFirst),保证"装上即可离线用";冷启动——进程全新启动(无缓存内存、引擎初始化),优化点:最小化入口 HTML 体积、预缓存清单命中关键资源(首屏 CSS/JS)、启动屏(background_color+图标)与首帧无缝衔接、避免启动路径上的同步长任务。设备差异:Android/桌面 Chrome 从安装启动即"应用窗口"(standalone 全屏,冷启动较快);iOS 从主屏图标启动走独立 WebApp 模式(Safari 内核),首次冷启动偏慢、离线启动依赖缓存完整性(无网络时未缓存内容直接失败);桌面端冷启动受系统资源与扩展影响。工程实践:安装后触发一次"预取+预热"(prefetch 关键页)、启动性能埋点(可交互时间)按设备维度观测。

回答按"离线启动保障 → 冷启动优化 → 设备差异 → 观测治理"组织,突出"导航预缓存"与"按设备观测启动指标"。

#

30. Web App Manifest 的 orientation 在锁屏方向的工程价值

Manifest 的 orientation 如何控制应用方向?锁屏方向的工程价值与注意点是什么?

  • orientation 的取值与作用范围
  • 与系统方向锁定的关系
  • 视频/全屏场景的工程配合

orientation 声明应用的默认与允许方向(portrait/landscape/any 等),安装后浏览器/系统按此锁定或初始化应用方向(移动端主屏启动时生效)。工程价值:为固定场景锁定体验——竖屏内容类(阅读、聊天)锁 portrait 防误转、视频/游戏/图表锁 landscape 提升沉浸感、仪表盘类按设备横竖屏自适应用 any。注意点:orientation 是"声明"而非强制——多数系统设置的方向锁(用户手动锁定)优先级更高(iOS 上系统锁优先、Android 桌面 PWA 支持差异大);页面内 CSS(screen.orientation.lock())可在运行时按需锁定(需全屏或安装态);方向切换触发 resize/orientationchange,布局需响应式适配(安全区、键盘);桌面端无方向概念,声明不影响。工程实践:按场景组合"manifest 声明 + 运行时 lock + CSS 适配",并在真机验证系统锁与应用锁的交互。

回答按"机制(声明+初始化)→ 场景价值 → 与系统锁的优先级 → 运行时配合"组织,突出"声明非强制"的准确认知。

#

31. PWA 在 Microsoft Store、PWA Builder 的发布工程实践

PWA 如何发布到 Microsoft Store?PWA Builder 在发布流程中扮演什么角色?

  • PWA Builder 的分析与打包(PWAB2)
  • Microsoft Store 的提交流程与要求
  • 多商店发布的统一工程化

PWA Builder(pwabuilder.com)是微软的 PWA 发布工具链:输入站点 URL 后自动分析可安装性(manifest/SW 质量)、生成跨平台打包(PWAB2 格式:MSIX 包供 Windows Store、Android 包供 Play 等)并给出修复建议,还能生成商店所需的图标/截图素材。发布到 Microsoft Store 的流程:PWA Builder 生成 MSIX → 用 Partner Center 创建应用提交(提供商店元数据、隐私政策、权限声明)→ 微软审核(对 PWA 有"作为应用"的验收,Store 侧通过后用户可从 Store 安装,获得系统级分发与自动更新)。工程价值:把"PWA 打包上架"标准化——无需原生工程即可进入 Windows 应用生态;注意点:PWA Builder 的分析结果(SW 缓存策略、manifest 完整性)需先修达标;MSIX 的更新走 Store(或包外自更新需声明);Store 审核要求(隐私、数据用途说明、图标规范)按清单准备;多商店(Windows/Play/Chrome Web Store)素材与描述需分别适配,可用工具链统一生成后人工校准。

回答按"PWAB2 机制 → Store 提交流程 → 审核合规 → 多商店统一治理"组织,突出"分析-修复-打包-提交"的流水线。

#

32. Web App Manifest 在 PWA 检测(Lighthouse、PWA Builder)

Lighthouse 与 PWA Builder 如何检测 PWA?检测项的工程意义是什么?

  • Lighthouse 的 PWA 审计项(Manifest/SW/离线)
  • PWA Builder 的评分与修复建议
  • 检测驱动开发的实践

Lighthouse(Chrome DevTools/Lighthouse CLI)对 PWA 做审计:可安装性(manifest 存在且字段合规、图标规格、HTTPS、SW 注册)、离线能力(离线响应)、启动体验(启动 URL 可响应、跳转优化)、安全(HTTPS 与混合内容);输出带权重的评分与逐项修复建议,帮助团队把"可安装+离线+启动快"落到实处。PWA Builder 侧重"发布就绪度":检查 manifest/SW 质量并给修复建议、验证多平台兼容、生成商店打包素材,评分反映"能否顺利进入应用商店"。工程意义:检测项即"验收标准"——把检测纳入 CI(Lighthouse CI 对关键页审计、分数门禁),防止回归(manifest 缺字段、SW 失效、图标缺失);按审计建议修复(补充 maskable 图标、预缓存导航、加 background_color)顺序落地;注意 Lighthouse 分数是工程质量的代理指标,最终以真机安装与离线实测为准。

回答按"两工具各自的检测维度 → 检测项的工程意义 → CI 门禁化实践"组织,突出"检测驱动修复、分数与实测并重"。