--- title: Service Worker API slug: Web/API/Service_Worker_API tags: - API - Offline - SAP - Service Worker - WPA - Workers translation_of: Web/API/Service_Worker_API ---
{{ServiceWorkerSidebar}}
Service workers 本质上充当 Web 应用程序、浏览器与网络(可用时)之间的代理服务器。这个 API 旨在创建有效的离线体验,它会拦截网络请求并根据网络是否可用来采取适当的动作、更新来自服务器的的资源。它还提供入口以推送通知和访问后台同步 API。
Service worker是一个注册在指定源和路径下的事件驱动worker。它采用JavaScript控制关联的页面或者网站,拦截并修改访问和资源请求,细粒度地缓存资源。你可以完全控制应用在特定情形(最常见的情形是网络不可用)下的表现。
Service worker运行在worker上下文,因此它不能访问DOM。相对于驱动应用的主JavaScript线程,它运行在其他线程中,所以不会造成阻塞。它设计为完全异步,同步API(如XHR和localStorage)不能在service worker中使用。
出于安全考量,Service workers只能由HTTPS承载,毕竟修改网络请求的能力暴露给中间人攻击会非常危险。在Firefox浏览器的用户隐私模式,Service Worker不可用。
注意:Service workers之所以优于以前同类尝试(如AppCache),是因为它们无法支持当操作出错时终止操作。Service workers可以更细致地控制每一件事情。
注意:Service workers大量使用Promise,因为通常它们会等待响应后继续,并根据响应返回一个成功或者失败的操作。Promise非常适合这种场景。
使用 {{domxref("ServiceWorkerContainer.register()")}} 方法首次注册service worker。如果注册成功,service worker就会被下载到客户端并尝试安装或激活(见下文),这将作用于整个域内用户可访问的URL,或者其特定子集。
此时,你的服务工作者(service worker)将遵守以下生命周期:
用户首次访问service worker控制的网站或页面时,service worker会立刻被下载。
之后,在以下情况将会触发更新:
无论它与现有service worker不同(字节对比),还是第一次在页面或网站遇到service worker,如果下载的文件是新的,安装就会尝试进行。
如果这是首次启用service worker,页面会首先尝试安装,安装成功后它会被激活。
如果现有service worker已启用,新版本会在后台安装,但不会被激活,这个时序称为worker in waiting。直到所有已加载的页面不再使用旧的service worker才会激活新的service worker。只要页面不再依赖旧的service worker,新的service worker会被激活(成为active worker)。
你可以监听{{domxref("InstallEvent")}},事件触发时的标准行为是准备service worker用于使用,例如使用内建的storage API来创建缓存,并且放置应用离线时所需资源。
还有一个activate事件,触发时可以清理旧缓存和旧的service worker关联的东西。
Servcie worker可以通过 {{domxref("FetchEvent")}} 事件去响应请求。通过使用 {{domxref("FetchEvent.respondWith") }} 方法,你可以任意修改对于这些请求的响应。
注意: 因为oninstall
和onactivate
完成前需要一些时间,service worker标准提供一个waitUntil
方法,当oninstall
或者onactivate
触发时被调用,接受一个promise。在这个 promise被成功resolve以前,功能性事件不会分发到service worker。
构建一个基本用例的完整教程,请阅读 使用 Service Workers。
Service workers也可以用来做这些事情:
未来service workers能够用来做更多使web平台接近原生应用的事。 值得关注的是,其他标准也能并且将会使用service worker,例如:
install和activate
事件时序,作为service worker生命周期的一部分。这会确保任何功能型事件(如{{domxref("FetchEvent")}})不被分发到{{domxref("ServiceWorker")}},直到它更新了数据库架构、删除过期缓存项等等以后。InstallEvent接口代表一个在
{{domxref("ServiceWorker")}}的{{domxref("ServiceWorkerGlobalScope")}}中分发的安装动作,作为
{{domxref("ExtendableEvent")}}的子事件,它保证诸如{{domxref("FetchEvent")}} 的功能性事件在安装过程中不会被分发。NotificationEvent
接口代表在{{domxref("ServiceWorker")}}里{{domxref("ServiceWorkerGlobalScope")}}中分发的单击事件通知。ServiceWorker对象相关联。
navigator.serviceWorker
为目标的事件信息。Note that this interface is deprecated in modern browsers. Service worker messages will now use the {{DOMxRef("MessageEvent")}} interface, for consistency with other web messaging features.ServiceWorker
's state.Specification | Status | Comment |
---|---|---|
{{SpecName('Service Workers')}} | {{Spec2('Service Workers')}} | Initial definition. |
{{ CompatibilityTable() }}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | {{CompatChrome(40.0)}} | {{ CompatGeckoDesktop("44.0") }}[1] | {{ CompatNo() }} | 24 | {{ CompatNo() }} |
install/activate events | {{ CompatChrome(40.0) }} | {{ CompatGeckoDesktop("44.0") }}[1] | {{ CompatNo() }} | {{ CompatVersionUnknown() }} | {{ CompatNo() }} |
fetch event/request/respondWith() |
{{CompatChrome(40.0)}} | {{ CompatGeckoDesktop("44.0") }}[1] | {{ CompatNo() }} | {{ CompatNo() }} | {{ CompatNo() }} |
caches/cache |
{{CompatChrome(42.0)}} |
{{ CompatGeckoDesktop("39.0") }}[1] | {{ CompatNo() }} | {{ CompatNo() }} | {{ CompatNo() }} |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | Firefox OS | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | {{CompatChrome(40.0)}} | {{ CompatGeckoMobile("44.0") }} | {{ CompatVersionUnknown }} | {{ CompatNo() }} | {{ CompatVersionUnknown() }} | {{ CompatNo() }} | |
install/activate events | {{ CompatNo() }} | {{CompatChrome(40.0)}} | {{ CompatGeckoMobile("44.0") }} | {{ CompatVersionUnknown }} | {{ CompatNo() }} | {{ CompatVersionUnknown() }} | {{ CompatNo() }} |
fetch event/request/respondWith() |
{{ CompatNo() }} | {{CompatChrome(40.0)}} | {{ CompatGeckoMobile("44.0") }} | {{ CompatVersionUnknown }} | {{ CompatNo() }} | {{ CompatNo() }} | {{ CompatNo() }} |
caches/cache | {{ CompatNo() }} | {{CompatChrome(40.0)}} | {{ CompatGeckoMobile("39.0") }} | {{ CompatVersionUnknown }} | {{ CompatNo() }} | {{ CompatNo() }} | {{ CompatNo() }} |
[1] Service workers (and Push) have been disabled in the Firefox 45 Extended Support Release (ESR.)