Service Worker 为你服务

更新:本文之前的版本提到 Service Worker API 在所有使用 WKWebView 的应用中可用。目前,它仅在 Safari、使用 SFSafariViewController 的应用以及保存到主屏幕的 Web 应用中可用。

The Service Worker API 为网页提供持久的后台处理能力。Safari Technology Preview 48、macOS High Sierra 10.13.4 和 iOS 11.3 beta seed 2 中提供了支持。虽然 WebKit 的实现和功能集正在快速演进,但我们认为它在功能性和合规性方面达到了一个重要里程碑:使用 service worker 实现离线支持或网络/缓存优化的应用程序在最新的 WebKit 构建版本上成功运行。现在,让我们深入了解 WebKit Service Worker API 实现的细节。

根据规范,service worker 和 service worker 客户端根据其源(origin)进行分区。为了防止用户跨站跟踪,WebKit 根据顶层文档源(即地址栏中显示的源)进一步划分 service worker 和 service worker 客户端。与顶层文档同源的框架将与其他浏览器引擎表现相同。对于跨源框架,WebKit 的行为有所不同。由 webkit.org 页面中一个 example.com iframe 注册的 service worker 将能够与共享相同 (webkit.org, example.com) 分区的所有 service worker 和客户端通信,但不能与任何其他 example.comwebkit.org 客户端通信。由 (webkit.org, example.com) service worker 发起的网络加载将使用与在嵌入 webkit.org 页面的 example.com 框架中进行的网络加载相同的 cookie。类似地,通过根据浏览会话对 service worker 进行分区,在 service worker 中强制执行私密浏览模式。

The Service Worker API 在 WebKit 的多进程基础设施中实现,这既提供了安全性又带来了性能优势。Service worker 实例运行在独立的 service worker 进程中。这个进程类似于负责渲染网页和执行任意 JavaScript 的 WebContent 进程。一个单独的进程,即 Storage 进程,负责处理 service worker 的注册、持久化和生命周期。由于 service worker 实例会消耗内存和 CPU 时间,因此仅在需要时运行它们非常重要。Service worker 通常在网页首次注册时启动。正常情况下,当其分区中经过短暂宽限期后没有 service worker 客户端时,service worker 将被终止。每当需要某些交互时,通常在发生 postMessage 或 fetch 事件时,service worker 会被重新启动。

The Cache API 允许持久存储 fetch 请求和响应。这是实现离线支持和基于代理的网络优化的关键 API。与 service worker 类似,缓存也根据(顶层源,框架源)和浏览会话进行分区。当前的 Cache API 配额设置为每个分区固定值 50 MiB。达到此限制后,Web 应用程序需要驱逐缓存条目以释放空间。Service worker 和缓存的持久化信息都可以通过 WebKit API 清除。在 Safari Technology Preview 中,这些信息位于“隐私”偏好设置窗格的“缓存”类别中。

Service worker 和 Cache API 存储的信息会随着用户浏览内容而增长。为了仅保留对用户有用的存储信息,WebKit 将在几周后移除未使用的 service worker 注册。几周后未被打开的缓存也将被移除。Web 应用程序必须对任何单个缓存、缓存条目或 service worker 的移除具有弹性。

Web Inspector 支持调试 service worker。“开发”菜单随时包含正在运行的 service worker 列表。点击其中一个 service worker 条目时,会将一个检查器附加到该 service worker。在此,您可以使用断点调试与 fetch 或 postMessage 事件相关的代码。检查器控制台也是一个很好的地方,可以使用 fetch API 在 service worker 的上下文中触发网络加载。只需几行代码,也可以从控制台检查 service worker 缓存。

我们很高兴看到 service worker 应用来到 WebKit 和 Apple 平台。我们鼓励您试用 Safari Technology Preview 48、macOS High Sierra 10.13.4 beta seed 2 和 iOS 11.3 beta seed 2 中提供的最新实现和功能集。我们渴望听到您的反馈提交 Bug、发送电子邮件至web-evangelist@apple.com,或发推特给@webkit