Service Worker Static Route API 源试用

Brendan Kenny
Brendan Kenny

Service Worker 是一款功能强大的工具,可让网站离线工作并为自身创建专用缓存规则。Service Worker fetch 处理程序会看到来自其控制的页面的每个请求,并且可以决定是否要从 Service Worker 缓存提供对其的响应,甚至可以重写网址以完全提取不同的响应 - 例如,根据本地用户的偏好设置。

但是,如果在一段时间内首次加载页面并且控制 Service Worker 当前并未运行,则 Service Worker 可能会产生性能成本。由于所有提取都需要通过 Service Worker 进行,因此浏览器必须等待 Service Worker 启动并运行才能知道要加载哪些内容。对于使用 Service Worker 通过缓存策略提高性能的开发者来说,这种启动成本可能很小,但却很高。

导航预加载是解决问题的一种方法(允许在 Service Worker 启动的同时通过网络发出导航请求,但仅限于初始导航请求,并且仍然在关键路径中包含 Service Worker)。自导航预加载功能推出以来,已进行多项努力来开发更通用的解决问题空间解决方案,包括为使某些请求在 Service Worker 启动时完全不被阻止的方法。

Service Worker Static Routing API

从 Chrome 116 开始,实验性 Service Worker Static Routing API 可用于测试此类解决方案的第一步。安装 Service Worker 时,它可以使用 Service Worker Static Routing API 以声明方式声明应如何提取某些资源路径。

在 API 的初始版本中,可将路径声明为始终从网络(而非 Service Worker)提供。如果稍后加载受控网址,浏览器可以在 Service Worker 完成启动之前开始从这些路径中提取资源。这会将 Service Worker 从您知道不需要 Service Worker 的路径中移除。

如需使用 API,Service Worker 需要使用一组规则对 install 事件调用 event.registerRouter

self.addEventListener('install', event => {
  if (event.registerRouter) {
    // Go straight to the network and bypass invoking "fetch" handlers for all
    // same-origin URLs that start with '/form/'.
    event.registerRouter([{
      condition: {
        urlPattern: {pathname: '/form/*'},
      },
      source: 'network',
    }]);
  }
});

每条规则通常有两个属性:

  • condition:指定何时使用 网址 Pattern API 应用规则以匹配资源路径。该属性可以采用 URLPattern 实例,也可以是与传入 URLPattern 构造函数兼容的等效普通对象(例如,new URLPattern({pathname: '*.jpg'}) 或仅包含 {pathname: '*.jpg'})。

    网址格式的灵活性意味着,规则可以将路径下的任何资源等简单内容匹配到非常具体、详细的条件。一般来说,常用路由库的用户应该熟悉这些模式。

  • source:指定如何加载与 condition 匹配的资源。目前,仅支持 'network' 值(绕过 Service Worker 以直接通过网络加载资源),但计划在日后扩展此值

使用场景

如前所述,该 API 的初始版本本质上是 Service Worker 控制某些路径的应急路径。适合使用 Service Worker 的方式取决于您如何使用 Service Worker,以及用户如何遍历您的网站。

例如,您的网站使用缓存优先策略(回退到网络),但有些内容访问频率极低,导致其被缓存在缓存中几乎没有任何价值(例如归档内容或 RSS Feed)。只能在 Service Worker 中设置这些路径,限制要从网络中提取这些路径,但 Service Worker 仍必须启动并运行才能决定如何处理这些请求。

相比之下,静态路由 API 会使用几行声明性代码来完全绕过 Service Worker:

self.addEventListener('install', event => {
  if (event.registerRouter) {
    event.registerRouter([{
      condition: {
        urlPattern: {pathname: '/feeds/*.xml'},
      },
      source: 'network',
    }, {
      condition: {
        urlPattern: {pathname: '/archives/*'},
      },
      source: 'network',
    }]);
  }
});

随着 Service Worker Static Routing API 的发展,我们计划提高此配置的灵活性,以支持更多场景,例如以声明方式争用网络提取和 Service Worker 启动。如需了解详情,请参阅规范说明器对可能的 API“最终形式”的探索

试用 Service Worker Static Routing API

源试用期间,Chrome 中的 Service Worker Static Routing API 从版本 116 开始可用,以便开发者通过真实用户在其网站上测试此 API 以衡量效果。如需了解源试用的背景信息,请参阅源试用使用入门

对于本地测试,可通过在 chrome://flags/#service-worker-static-router 中使用标志或通过使用命令(例如 --enable-features=ServiceWorkerStaticRouter)运行 Chrome 来启用 Service Worker Static Routing API。

反馈和未来方向

Service Worker Static Routing API 正在积极开发中,并且仍在完善中。如果您认为它可能对您有用,请通过源试用进行试用,并提供有关 API、实现和可用功能的反馈