WebView 是否支持 Service Worker?是否支持 WebGL?是否支持多实例隔离?是否可以共享 Cookie?是否支持进程级缓存?
在 HarmonyOS 的混合开发架构中,Web 组件对现代 Web 标准的支持非常全面,同时也针对多实例和安全性做了深层的架构隔离。
1. 是否支持 Service Worker?
结论:支持,但需要手动开启。
Service Worker 是实现 PWA(离线应用)的核心,允许网页在后台处理缓存和推送。
- 配置方式:在
Web组件初始化前,必须通过setServiceWorkerWebContext开启上下文支持。 - 拦截能力:Service Worker 内部的请求同样可以被原生的
onInterceptRequest捕获,从而实现“原生+Service Worker”的双重缓存策略。
2. 是否支持 WebGL?
结论:完全支持。
WebView 借用了 Chromium 的高性能渲染管线,支持 WebGL 1.0 和 2.0。
- 硬件加速:WebGL 的指令会通过 GPU 进程进行硬件加速渲染。
- 性能注意:WebGL 对内存占用极高,在低端机型上同时运行多个 WebGL 实例可能触发渲染进程崩溃(OOM)。建议在页面不可见时通过
onInactive()暂停渲染。
3. 是否支持多实例隔离?
结论:支持进程级隔离,但属于“有条件的隔离”。
HarmonyOS 的 WebView 采用 多进程模型,其隔离策略如下:
- 渲染隔离:默认情况下,不同域名的
Web组件实例通常运行在不同的 Render 进程 中。这意味着一个实例的 JS 执行崩溃不会影响另一个实例。 - 内核共享:所有的
Web组件共享同一个 Browser 进程(主控进程),负责统一的网络调度和存储管理。
4. 是否可以共享 Cookie?
结论:支持,且默认在同域名下自动共享。
WebView 维护了一个全局的 Cookie Manager:
- 持久化同步:当你在实例 A 中登录并设置了 Cookie,实例 B 在访问相同域名时会自动携带该 Cookie。
- 原生操作:你可以使用
web_webview.WebCookieManager接口在 ArkTS 侧手动读取、设置或清除全量的 Cookie,实现原生登录态与 Web 侧的无缝同步。
5. 是否支持进程级缓存?
结论:支持。
WebView 的缓存分为两个维度:
-
内存缓存 (Memory Cache) :存在于各渲染进程中,速度极快,但随进程销毁。
-
磁盘缓存 (Disk Cache/HTTP Cache) :这是进程级共享的。所有的 Web 实例共用同一个缓存目录。
- 持久性:即使应用重启,只要服务器设置了有效的缓存头(Cache-Control),WebView 就会直接从本地磁盘读取资源,不再走网络。
- 手动清理:可以通过
removeCache(true)强制清除所有实例的进程级磁盘缓存。
总结对比
| 特性 | 支持情况 | 备注 |
|---|---|---|
| Service Worker | 支持 | 适合离线包增强和后台推送。 |
| WebGL | 支持 | 支持高性能 3D 渲染,建议开启硬件加速。 |
| 多实例隔离 | 进程级隔离 | 提高稳定性,防止单个页面卡死应用。 |
| Cookie 共享 | 自动共享 | 同域名下无需手动干预,全局统一管理。 |
| 进程级缓存 | 全实例共享 | 减少重复资源的下载,提升首屏速度。 |
架构师提示:
虽然支持多实例隔离,但每个 Web 组件实例都是一个昂贵的资源。避免在同一页面同时挂载超过 3 个 Web 组件,否则会导致 GPU 内存压力过大,引发系统级的丢帧。