FetchEvent:respondWith() 方法
注意:此功能仅在 Service Workers 中可用。
respondWith()
方法是 FetchEvent
的方法,它可以阻止浏览器默认的获取处理,并允许您自己提供 Response
的 promise。
在大多数情况下,您可以提供接收者理解的任何响应。例如,如果 <img>
发起了请求,则响应体需要是图像数据。出于安全原因,存在一些全局规则
- 如果
fetchEvent.request
对象的mode
为 "no-cors
",则您只能返回Response
对象,其type
为 "opaque
"。这可以防止泄露私有数据。 - 如果
fetchEvent.request
对象的mode
为 "manual
",则您只能返回Response
对象,其type
为 "opaqueredirect
"。 - 如果
fetchEvent.request
对象的mode
为 "same-origin
",则您无法返回Response
对象,其type
为 "cors
"。
指定资源的最终 URL
从 Firefox 59 开始,当服务工作者向 FetchEvent.respondWith()
提供 Response
时,Response.url
值将作为最终解析的 URL 传播到被拦截的网络请求。如果 Response.url
值为空字符串,则 FetchEvent.request.url
将用作最终 URL。
过去,FetchEvent.request.url
在所有情况下都用作最终 URL。提供的 Response.url
实际上被忽略了。
这意味着,例如,如果服务工作者拦截了样式表或工作者脚本,则提供的 Response.url
将用于解析任何相对的 @import
或 importScripts()
子资源加载 (Firefox 错误 1222008 )。
对于大多数类型的网络请求,此更改没有影响,因为您无法观察最终 URL。但是,在少数情况下,它很重要
- 如果
fetch()
被拦截,则您可以在结果的Response.url
上观察最终 URL。 - 如果 工作者 脚本被拦截,则最终 URL 用于设置
self.location
,并用作工作者脚本中相对 URL 的基本 URL。 - 如果样式表被拦截,则最终 URL 用作解析相对
@import
加载的基本 URL。
请注意,Windows
和 iframes
的导航请求不会使用最终 URL。HTML 规范处理导航重定向的方式最终会使用请求 URL 作为最终的 Window.location
。这意味着网站仍然可以提供网页的“替代”视图,即使处于脱机状态,也不会更改用户可见的 URL。
语法
respondWith(response)
参数
返回值
无 (undefined
)。
异常
NetworkError
DOMException
-
如果在
FetchEvent.request.mode
和Response.type
值的某些组合上触发了网络错误,则会返回此错误,如上面列出的“全局规则”中所暗示的那样。 InvalidStateError
DOMException
-
如果事件尚未分派或
respondWith()
已经调用,则会返回此错误。
示例
此获取事件尝试从缓存 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()
是一个便利方法。等效的功能是调用每个缓存上的 cache.match()
(按 caches.keys()
返回的顺序),直到返回 Response
。
规范
规范 |
---|
Service Workers # fetch-event-respondwith |
浏览器兼容性
BCD 表格仅在启用了 JavaScript 的浏览器中加载。