ServiceWorker - 提供了对服务工作线程的引用

ServiceWorkerServiceWorker API 的接口,提供了对服务工作线程的引用。多个浏览上下文(例如页面,工作线程等)可以与同一服务工作线程相关联,每个都通过独立的 ServiceWorker 对象。

ServiceWorkerRegistration.active 属性和 ServiceWorkerContainer.controller 属性中可以使用 ServiceWorker 对象 - 这是已激活并已控制页面(服务工作线程已成功注册,并且已重新加载受控页面。)

ServiceWorker 接口调度了一组生命周期事件(installactivate)以及包括 fetch 在内的功能性事件。一个 ServiceWorker 对象具有与其生命周期相关的关联 ServiceWorker.state

属性

ServiceWorker 从其父接口 Worker 继承了属性。

ServiceWorker.scriptURL 只读

返回定义为 ServiceWorkerRegistration 一部分的 ServiceWorker 序列化脚本 URL。该 URL 必须与注册 ServiceWorker 的文档具有相同的来源。

ServiceWorker.state 只读

返回服务工作线程的状态。它返回以下值之一:installinginstalled, activatingactivatedredundant

事件处理程序

ServiceWorker.onstatechange 只读

一个 EventListener,每当触发 statechange 类型的事件时就会调用。它基本上是在 ServiceWorker.state 更改时触发的。

方法

ServiceWorker 接口从其父接口 Worker 继承了方法,但 Worker.terminate 除外 — 服务工作者不应访问此方法。

更多实例

此代码段来自服务工作线程注册事件实例在线演示)。该代码监听 ServiceWorker.state 中的任何更改并返回其值。

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('service-worker.js', {
        scope: './'
    }).then(function (registration) {
        var serviceWorker;
        if (registration.installing) {
            serviceWorker = registration.installing;
            document.querySelector('#kind').textContent = 'installing';
        } else if (registration.waiting) {
            serviceWorker = registration.waiting;
            document.querySelector('#kind').textContent = 'waiting';
        } else if (registration.active) {
            serviceWorker = registration.active;
            document.querySelector('#kind').textContent = 'active';
        }
        if (serviceWorker) {
            // logState(serviceWorker.state);
            serviceWorker.addEventListener('statechange', function (e) {
                // logState(e.target.state);
            });
        }
    }).catch (function (error) {
        // 注册时出了点问题。 service-worker.js 文件可能不可用或包含语法错误。
    });
} else {
    // 当前的浏览器不支持服务工作线程。
}

规范

规范 状态 备注
Service Workers
ServiceWorker 的定义
工作草案 初始定义。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持40

17

16

441 不支持2711.1
onstatechange40

17

16

441 不支持2711.1
scriptURL40

17

16

441 不支持2711.1
state40

17

16

441 不支持2711.1

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持4040 未知44 未知2711.3
onstatechange4040 未知44 未知2711.3
scriptURL4040 未知44 未知2711.3
state4040 未知44 未知2711.3

1. 在 Firefox 45 和 52 扩展支持版本(ESR)中,服务 worker(和 Push)已被禁用。

相关链接