FetchEvent - 在服务 worker 全局范围上调度的 fetch 事件的事件类型
这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
FetchEvent
是在服务 worker 全局范围上调度的 fetch
事件的事件类型。它包含有关 fetch 的信息,包括请求以及接收器如何处理响应。它提供了 event.respondWith()
方法,允许我们提供该 fetch 的响应。
构造函数
FetchEvent()
创建一个新的 FetchEvent
对象。通常不使用该构造函数。浏览器自己创建这些对象并将它们提供给 fetch
事件回调。
属性
从其祖先 Event
继承了属性。
fetchEvent.clientId
只读
fetchEvent.preloadResponse
只读
一个 Promise
,用于 Response
,如果它不是一个 navigation,或 navigation preload 未启用,则为 void。
fetchEvent.request
只读
浏览器要发送的 Request
。
方法
从其祖先 ExtendableEvent
继承了属性。
fetchEvent.respondWith()
阻止浏览器的默认 fetch 处理,并自己提供(promise)响应。
extendableEvent.waitUntil()
延长活动的生命周期。用于向浏览器通知超出响应返回范围的任务,例如流和缓存。
实例
该 fetch 事件使用浏览器默认行为来处理 GET 之外的请求。对于 GET 请求,它尝试在缓存中返回匹配,然后回退到网络请求。如果它在缓存中找到匹配项,则会异步更新缓存以供下次使用。
self.addEventListener('fetch', event => {
// 让浏览器为 GET 之外的请求执行默认操作。
if (event.request.method != 'GET') return;
// 阻止默认操作,改为自己处理请求。
event.respondWith(async function() {
// 尝试从缓存中获取响应。
const cache = await caches.open('dynamic-v1');
const cachedResponse = await cache.match(event.request);
if (cachedResponse) {
// 如果我们在缓存中找到匹配项,则将其返回,但也会在后台更新缓存中的条目。
event.waitUntil(cache.add(event.request));
return cachedResponse;
}
// 如果我们在缓存中找不到匹配项,则回退到网络请求。
return fetch(event.request);
}());
});
规范
规范 | 状态 | 备注 |
---|---|---|
Service Workers FetchEvent() 的定义 |
编者的草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 40 | 支持 | 441 | 不支持 | 27 | 不支持 |
client |
42 | 未知 | 44 | 不支持 | 24 | 不支持 |
clientId |
49 | 未知 | 451 | 不支持 | 36 | 不支持 |
isReload |
45 | 17 | 441 | 不支持 | 32 | 不支持 |
navigationPreload |
59 | 未知 | 未知 | 未知 | 46 | 未知 |
preloadResponse |
59 | 未知 | 未知 | 未知 | 46 | 未知 |
request |
支持 | 未知 | 44 | 不支持 | 支持 | 不支持 |
respondWith |
422 | 未知 |
593 441 |
不支持 | 29 | 不支持 |
resultingClientId |
未知 | 未知 | 未知 | 未知 | 未知 | 未知 |
targetClientId |
未知 | 未知 | 未知 | 未知 | 未知 | 未知 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 40 | 40 | 未知 | 44 | 未知 | 27 | 不支持 |
client |
未知 | 44 | 未知 | 不支持 | 未知 | 未知 | 不支持 |
clientId |
49 | 49 | 未知 | 45 | 未知 | 36 | 不支持 |
isReload |
45 | 45 | 17 | 44 | 未知 | 32 | 不支持 |
navigationPreload |
59 | 59 | 未知 | 未知 | 未知 | 46 | 未知 |
preloadResponse |
59 | 59 | 未知 | 未知 | 未知 | 46 | 未知 |
request |
未知 | 支持 | 未知 | 未知 | 未知 | 支持 | 未知 |
respondWith |
422 | 422 | 未知 | 未知 | 未知 | 29 | 未知 |
resultingClientId |
未知 | 未知 | 未知 | 未知 | 未知 | 未知 | 未知 |
targetClientId |
未知 | 未知 | 未知 | 未知 | 未知 | 未知 | 未知 |
1. 已在 Firefox 45 和 52 扩展支持版本(ESR)中禁用了服务工作者(和推送)
2. 如果请求模式是同源且响应类型是 cors,则抛出 NetworkError(请参阅 bug 1222008)。这项工作正在进行中 - 请参阅 https://www.chromestatus.com/feature/5694278818856960。
3. 如果请求模式是同源且响应类型是 cors,则抛出 NetworkError(请参阅 bug 1222008)。