7-11.【WebView】WebView 是否支持 Service Worker?是否支持 WebGL?是否支持多实例隔离?是否可以共享 Cookie?

2 阅读3分钟

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 内存压力过大,引发系统级的丢帧。