ServiceWorkerGlobalScope - 表示服务工作线程的全局执行上下文
ServiceWorkerGlobalScope
是 ServiceWorker API 的接口,表示服务工作线程的全局执行上下文。
开发人员应记住,ServiceWorker
状态不会在终止 / 重新启动周期中保持不变,因此每个事件处理程序都应该假设它是用一个缺省的全局状态来调用的。
成功注册后,服务工作线程可以并且将在空闲时被终止,以节省内存和处理器电量。活动的服务工作线程会自动重新启动以响应事件,例如 ServiceWorkerGlobalScope.onfetch
或 ServiceWorkerGlobalScope.onmessage
。
另外,服务工作线程内部不允许同步请求 - 只能使用异步请求,例如通过 fetch()
方法启动的异步请求。
此接口继承自 WorkerGlobalScope
接口及其父级 EventTarget
,因此实现了 WindowTimers
,WindowBase64
和 WindowEventHandlers
。
属性
ServiceWorkerGlobalScope.clients
只读
包含与服务工作线程相关联的 Clients
对象。
ServiceWorkerGlobalScope.registration
只读
包含 ServiceWorkerRegistration
对象,该对象代表服务工作线程的注册。
ServiceWorkerGlobalScope.caches
只读
包含与服务工作者相关联的 CacheStorage
对象。
Events
activate
在 ServiceWorkerRegistration
获取新的 ServiceWorkerRegistration.active
工作线程时发生。也可以通过 ServiceWorkerGlobalScope.onactivate
属性处理。
fetch
在调用 fetch()
时发生。也可以通过 ServiceWorkerGlobalScope.onfetch
属性处理。
install
在 ServiceWorkerRegistration
获得新的 ServiceWorkerRegistration.installing
工作线程时发生。也可以通过 ServiceWorkerGlobalScope.oninstall
属性处理。
message
在收到传入消息时发生。受控页面可以使用 MessagePort.postMessage()
方法将消息发送给服务工作线程。服务工作线程可以选择通过 MessagePort
中公开的 event.data.port
发送回响应,对应于受控页面。也可以通过 ServiceWorkerGlobalScope.onmessage
属性处理。
notificationclick
当用户单击显示的通知时发生。也可以通过 ServiceWorkerGlobalScope.onnotificationclick
属性处理。
notificationclose
当用户关闭显示的通知时发生。也可以通过 ServiceWorkerGlobalScope.onnotificationclose
属性处理。
push
在收到服务器推送通知时发生。也可以通过 ServiceWorkerGlobalScope.onpush
属性处理。
pushsubscriptionchange
当推送订阅已失效或即将失效时发生(例如,当推送服务设置到期时间时)。也可以通过 ServiceWorkerGlobalScope.onpushsubscriptionchange
属性处理。
sync
从服务工作线程客户端页面调用 SyncManager.register
时触发。如果网络可用,则立即尝试同步,或者一旦网络可用,则尝试进行同步。也可以通过 ServiceWorkerGlobalScope.onsync
属性处理。
方法
ServiceWorkerGlobalScope.skipWaiting()
允许当前服务工作线程注册在服务工作线程客户端正在使用时从等待状态变为活动状态。
ServiceWorkerGlobalScope 实现了 WorkerGlobalScope
(实现了 WindowOrWorkerGlobalScope
)。因此,它还具有以下可用属性:
GlobalFetch.fetch()
开始获取资源的过程。这将返回一个 Promise
,该 Promise
将解析为代表对您的请求的响应的 Response
对象。该算法是传递到服务工作线程上下文的获取处理的入口点。
实例
此代码段来自服务工作线程预取实例(请参阅预取在线实例。)ServiceWorkerGlobalScope.onfetch
事件处理程序监听 fetch
事件。触发后,代码返回一个 Promise
,该 Promise
将解析为 Cache
对象中的第一个匹配请求。如果未找到匹配项,则代码将从网络获取响应。
该代码还处理从 fetch()
操作引发的异常。注意,HTTP 错误响应(例如 404)不会触发异常。它将返回具有适当错误代码集的普通响应对象。
self.addEventListener('fetch', function(event) {
console.log('处理的提取事件', event.request.url);
event.respondWith(
caches.match(event.request).then(function(response) {
if (response) {
console.log('在缓存中找到响应:', response);
return response;
}
console.log('在缓存中找不到响应。即将从网络获取...');
return fetch(event.request).then(function(response) {
console.log('来自网络的响应是:', response);
return response;
}, function(error) {
console.error('提取失败:', error);
throw error;
});
})
);
});
规范
规范 | 状态 | 备注 |
---|---|---|
Service Workers ServiceWorkerGlobalScope 的定义 |
工作草案 | 初始定义 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
activate 事件 | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
caches | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
clients | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
install 事件 | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
message 事件 | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
notificationclick 事件 | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
onabortpayment | 61 | 未知 | 未知 | 不支持 | 未知 | 11.1 |
onactivate | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
oncanmakepayment | 61 | 未知 | 未知 | 不支持 | 未知 | 未知 |
onfetch | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
oninstall | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
onmessage | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
onmessageerror | 未知 | 未知 | 未知 | 不支持 | 未知 | 未知 |
onnotificationclick | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
onnotificationclose | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
onpaymentrequest | 57 | 未知 | 未知 | 不支持 | 未知 | 未知 |
onpush | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
onpushsubscriptionchange | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
onsync | 49 | 未知 | 441 | 不支持 | 24 | 11.1 |
push 事件 | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
pushsubscriptionchange 事件 | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
registration | 40 | 未知 | 441 | 不支持 | 24 | 11.1 |
skipWaiting | 40 | 未知 | 441 | 不支持 | 24 | 不支持 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
activate 事件 | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
caches | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
clients | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
install 事件 | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
message 事件 | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
notificationclick 事件 | 不支持 | 40 | 未知 | 44 | 未知 | 27 | 11.3 |
onabortpayment | 不支持 | 61 | 未知 | 未知 | 未知 | 未知 | 11.3 |
onactivate | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
oncanmakepayment | 不支持 | 61 | 未知 | 未知 | 未知 | 未知 | 未知 |
onfetch | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
oninstall | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
onmessage | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
onmessageerror | 未知 | 未知 | 未知 | 未知 | 未知 | 未知 | 未知 |
onnotificationclick | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
onnotificationclose | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
onpaymentrequest | 不支持 | 57 | 未知 | 未知 | 未知 | 未知 | 未知 |
onpush | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
onpushsubscriptionchange | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
onsync | 49 | 49 | 未知 | 44 | 未知 | 24 | 11.3 |
push 事件 | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
pushsubscriptionchange 事件 | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
registration | 40 | 40 | 未知 | 44 | 未知 | 24 | 11.3 |
skipWaiting | 40 | 40 | 未知 | 44 | 未知 | 24 | 不支持 |
1. 在 Firefox 45 和 52 扩展支持版本(ESR)中,服务 worker(和 Push)已被禁用。