CacheStorage: match() 方法

Baseline 已广泛支持

此功能已成熟,可跨多种设备和浏览器版本工作。它自 ⁨2018 年 4 月⁩ 起已在所有浏览器中可用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

CacheStorage 接口的 match() 方法用于检查给定的 Request 或 URL 字符串是否是已存储的 Response 的键。此方法返回一个 Promise,该 Promise 解析为一个 Response,如果没有找到匹配项,则解析为 undefined

您可以通过窗口中的 Window.caches 属性或在 worker 中的 WorkerGlobalScope.caches 属性来访问 CacheStorage

Cache 对象按创建顺序进行搜索。

注意: caches.match() 是一个便捷方法。等效的功能是按顺序(由 caches.keys() 返回的顺序)在每个缓存上调用 cache.match(),直到返回 Response

语法

js
match(request)
match(request, options)

参数

请求

您要匹配的 Request。这可以是一个 Request 对象或一个 URL 字符串。

options 可选

一个对象,其属性控制 match 操作中的匹配方式。可用选项包括:

ignoreSearch

一个布尔值,指定匹配过程是否应忽略 URL 中的查询字符串。例如,如果设置为 true,在执行匹配时将忽略 http://foo.com/?value=bar 中的 ?value=bar 部分。默认为 false

ignoreMethod

一个布尔值,如果设置为 true,则阻止匹配操作验证 Requesthttp 方法(通常只允许 GETHEAD)。默认为 false

ignoreVary

一个布尔值,如果设置为 true,则指示匹配操作不执行 VARY 头部匹配。换句话说,如果 URL 匹配,无论 Response 对象是否有 VARY 头部,都会找到匹配项。默认为 false

cacheName

一个字符串,表示要搜索的特定缓存。

返回值

一个 Promise,解析为匹配的 Response。如果未找到与指定请求匹配的响应,则 Promise 会解析为 undefined

示例

此示例来自 MDN 的 简单 service worker 示例(参见 正在运行的简单 service worker)。在这里,我们等待 FetchEvent 触发。我们像这样构建一个自定义响应:

  1. 使用 CacheStorage.match() 检查是否在 CacheStorage 中找到了请求的匹配项。如果是,则提供该匹配项。
  2. 如果不是,则使用 open() 打开 v1 缓存,使用 Cache.put() 将默认网络请求放入缓存,并使用 return response.clone() 返回默认网络请求的克隆。后者是必需的,因为 put() 会消耗响应体。
  3. 如果失败(例如,因为网络中断),则返回一个备用响应。
js
self.addEventListener("fetch", (event) => {
  event.respondWith(
    caches.match(event.request).then((response) => {
      // caches.match() always resolves
      // but in case of success response will have value
      if (response !== undefined) {
        return response;
      }
      return fetch(event.request)
        .then((response) => {
          // response may be used only once
          // we need to save clone to put one copy in cache
          // and serve second one
          let responseClone = response.clone();

          caches
            .open("v1")
            .then((cache) => cache.put(event.request, responseClone));
          return response;
        })
        .catch(() => caches.match("/gallery/myLittleVader.jpg"));
    }),
  );
});

规范

规范
Service Workers
# cache-storage-match

浏览器兼容性

另见