FetchEvent: respondWith() 方法
Baseline 广泛可用 *
注意:此功能仅在 Service Workers 中可用。
FetchEvent 的 respondWith() 方法会阻止浏览器的默认 fetch 处理,并允许您自己提供一个 的 Promise。Response
在大多数情况下,您可以提供接收方能够理解的任何响应。例如,如果一个 发起了请求,响应体就需要是图像数据。出于安全原因,有一些全局规则。<img>
- 只有当
对象的fetchEvent.request为mode"no-cors"时,您才能返回类型为"opaque"的对象。这可以防止私有数据泄露。Response - 只有当
对象的fetchEvent.request为mode"manual"时,您才能返回类型为"opaqueredirect"的对象。Response - 当
对象的fetchEvent.request为mode"same-origin"时,您不能返回类型为"cors"的对象。Response
指定资源的最终 URL
从 Firefox 59 开始,当 service worker 为 FetchEvent.respondWith() 提供 时,Response 值将被传播到被拦截的网络请求中,作为最终解析的 URL。如果 Response.url 值是空字符串,则使用 Response.url 作为最终 URL。FetchEvent.request.url
过去,在所有情况下, 都被用作最终 URL。提供的 FetchEvent.request.url 被有效忽略。Response.url
这意味着,例如,如果 service worker 拦截了一个样式表或 worker 脚本,那么提供的 将用于解析任何相对的 Response.url 或 @import 子资源加载(Firefox bug 1222008)。importScripts()
对于大多数类型的网络请求,此更改没有影响,因为您无法观察到最终 URL。但有一些情况,它确实很重要。
- 如果拦截了
,那么您可以在结果的fetch()上观察到最终 URL。Response.url - 如果拦截了 worker 脚本,那么最终 URL 用于设置
,并用作 worker 脚本中相对 URL 的基础 URL。self.location - 如果拦截了样式表,那么最终 URL 将用作解析相对
加载的基础 URL。@import
请注意, 和 Window 的导航请求不使用最终 URL。HTML 规范处理导航重定向的方式最终会将请求 URL 用于生成的 iframe。这意味着网站仍然可以在离线时提供网页的“备用”视图,而不会更改用户可见的 URL。Window.location
语法
respondWith(response)
参数
返回值
无(undefined)。
异常
NetworkErrorDOMException-
当
和FetchEvent.request.mode值出现某些组合时,会触发网络错误,如上面“全局规则”中所提示。返回此错误。Response.type InvalidStateErrorDOMException-
如果事件尚未分派或
respondWith()已被调用,则返回此值。
示例
此 fetch 事件尝试从缓存 API 返回响应,否则回退到网络。
addEventListener("fetch", (event) => {
// Prevent the default, and handle the request ourselves.
event.respondWith(
(async () => {
// Try to get the response from a cache.
const cachedResponse = await caches.match(event.request);
// Return it if we found one.
if (cachedResponse) return cachedResponse;
// If we didn't find a match in the cache, use the network.
return fetch(event.request);
})(),
);
});
注意: 是一个方便的方法。等效的功能是按顺序(由 caches.match() 返回的顺序)在每个缓存上调用 caches.keys(),直到返回 cache.match()。Response
规范
| 规范 |
|---|
| Service Workers # fetch-event-respondwith |
浏览器兼容性
加载中…