概念
PWA(Progressive Web App,渐进式 Web 应用):用 Web 技术(HTML/CSS/JavaScript)构建的、能提供接近原生 App 体验的应用。
核心思想:
用一套 Web 代码,同时获得"网页的可达性"(一个链接即可访问)和"原生应用的体验"(可安装、可离线、有推送)。
三大技术支柱
一、Service Worker(核心)
是什么:运行在浏览器后台的一段脚本,独立于页面——它可以拦截和处理网络请求。
能做什么:
1. 离线能力
通过 Cache API 缓存资源,在无网络时返回缓存内容。
这是 PWA 最标志性的能力——断网后应用仍可使用(至少部分功能)。
2. 网络代理与缓存策略
可以精细地控制:
- Cache First:优先用缓存(适合不常变的静态资源);
- Network First:优先网络,失败时用缓存(适合需要新鲜度的数据);
- Stale-While-Revalidate:先返回缓存(快),同时后台更新(下次访问时是新内容);
- Network Only / Cache Only。
这让开发者能针对不同类型的资源选择最优策略。
3. 后台同步(Background Sync)
用户离线时的操作(如提交表单、发消息),可以排队,等网络恢复后自动同步。
4. 推送通知(Push API)
接收服务器推送的消息并显示通知——即使用户没有打开页面。
二、Web App Manifest
一个 JSON 文件,描述应用的元数据:
{
"name": "我的应用",
"short_name": "应用",
"start_url": "/",
"display": "standalone",
"icons": [...],
"theme_color": "#ffffff"
}作用:
- 让浏览器知道这个网站可以被安装;
- 安装后的图标、名称、启动画面;
display 模式:
standalone:看起来像原生 App(无浏览器地址栏);fullscreen:全屏;minimal-ui:最小化的浏览器 UI;browser:普通浏览器标签页。
三、HTTPS
Service Worker 只在安全上下文(HTTPS 或 localhost)中可用。
原因:Service Worker 能拦截和修改网络请求——这是一项强大的能力,如果被中间人劫持,后果严重。
这也是为什么 HTTPS 已经成为 Web 的标准配置。
"渐进式"的含义
Progressive(渐进式)有两层含义:
一、功能渐进增强
- 在支持 Service Worker 的浏览器上,获得完整体验;
- 在不支持的浏览器上,仍然是一个能用的网站——只是没有离线和推送。
这与原生 App 形成对比:原生 App 要么装,要么不装。
二、体验渐进升级
用户第一次访问 → 用得多了 → 浏览器提示"添加到主屏幕" → 变成一个有图标的应用。
这个"渐进"的过程,正是 PWA 相对原生 App 的核心优势(见下)。
相对原生 App 的优势
一、无需应用商店
- 不需要审核(这既是优势也是风险——见下);
- 更新即时生效(用户下次打开就是新版);
- 不受商店的分成和规则约束。
二、安装门槛低
这是最大的优势。
原生 App 的转化漏斗:看到广告 → 跳转商店 → 下载(几十 MB)→ 安装 → 打开 → 注册。
每增加一步,都流失大量用户。
PWA:点击链接 → 立即使用 → 用得好了再"安装"(几乎是瞬间的)。
在用户获取成本上,这是数量级的差异。
三、体积小
通常远小于原生 App(因为没有内置运行时和原生二进制)。
四、可分享
一个 URL 就能分享——可以发在聊天里、印在海报上、放在搜索结果中。
五、统一代码库
一套代码,覆盖多个平台。
局限与争议
一、iOS 的支持相对滞后
这是 PWA 长期面临的最大问题。
- Safari 对 Service Worker 和 Manifest 的支持晚于 Chrome,且能力相对受限;
- 推送通知在 iOS 上的支持较晚才加入,且要求先"添加到主屏幕";
- 后台能力受限;
- 一些 API(如后台同步、某些硬件访问)在 iOS 上不可用或行为不同。
这使得"用 PWA 完全替代原生 App"在 iOS 上往往不现实。
二、无法访问所有系统能力
Web 平台的 API 在持续扩展(如文件系统访问、蓝牙、USB、NFC、相机、地理定位、剪贴板等),但:
- 仍有一些原生能力无法访问或受限;
- 某些 API 的浏览器兼容性不一致。
近年来 Web Capabilities Project("Project Fugu")正在系统性地补齐这些能力。
三、性能
- 经过良好优化的 PWA 可以非常流畅;
- 但在计算密集型场景(如复杂的 3D 游戏、实时视频处理)上,原生仍有优势;
- WebAssembly(后文会提到)正在缩小这一差距。
四、发现性
PWA 不在应用商店里——这意味着失去了商店带来的"自然流量",但也意味着不必付分成。
五、苹果的政策风险
由于 iOS 上的所有浏览器引擎实质上都受 WebKit 限制(在部分地区由于监管要求有所变化),PWA 的能力上限取决于 Apple 的实现。
现实中的应用
成功的案例:
- 星巴克:PWA 让订单量增加,且体积远小于原生 App;
- Twitter Lite:在低带宽市场表现良好;
- Pinterest:显著提升了核心指标。
共同特点:这些多是内容/交易型应用(电商、社交、资讯、工具),而非需要深度系统集成的应用。
什么时候选 PWA
适合的场景:
- 内容展示、电商、表单、工具类应用;
- 用户获取成本敏感(希望降低门槛);
- 目标市场带宽/存储受限(新兴市场);
- 团队希望一套代码覆盖多平台。
不太适合的场景:
- 需要深度系统集成(如需要常驻后台、复杂蓝牙交互);
- 计算密集型应用(重度游戏、视频编辑);
- 用户主要在 iOS 且依赖高级系统能力。
说明:本文为 Web 技术的知识整理,具体能力支持情况请参考各浏览器的最新文档。