ExtendableEvent - 扩展了 install 和 activate 事件的生命周期

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

ExtendableEvent 接口扩展了 installactivate 事件的生命周期,它们作为服务 worker 生命周期一部分,在全局作用域上调度。这可确保在升级数据库并删除过时的缓存条目之前,不会调度任何功能事件(如FetchEvent)。

如果在 ExtendableEvent 处理程序之外调用 waitUntil(),则浏览器将抛出 InvalidStateError;另请注意,多个调用将叠加,并且生成的 promise 将添加到 extend lifetime promises 列表中。

注意:上一段中描述的行为在 Firefox 43 中得到修复(参见 Mozilla bug 1180274。)

该接口继承了 Event 接口。

注意:该接口仅在全局范围为 ServiceWorkerGlobalScope 时可用。当它是 Window 或其他类型的工作者的范围时,它不可用。

构造函数

ExtendableEvent()

创建一个新的 ExtendableEvent 对象。

属性

不实现任何自有属性,但从其父接口 Event 继承了属性。

方法

从其接口 Event 继承了方法。

ExtendableEvent.waitUntil()

扩展了事件的生命周期。它旨在 install EventHandler 中调用来 安装 worker,在 active EventHandler 中来 激活 worker。

实例

该代码段来自 service worker prefetch sample(请参阅 prefetch 实时实例。)代码在 ServiceWorkerGlobalScope.oninstall 中调用 ExtendableEvent.waitUntil(),延迟处理安装的 ServiceWorkerRegistration.installing worker,直到传递的 promise 成功解析。在获取和缓存所有资源时,或者在发生任何异常时,promise 将被解析。

代码段还显示了服务 worker 使用的版本控制缓存的最佳实践。虽然该示例中只有一个缓存,但相同的方法可用于多个缓存。它将缓存的速记标识符映射到特定的版本化缓存名称。

注意:在 Chrome 中,通过右键菜单的 “检查” 操作可以看到通过 chrome://serviceworker-internals 访问的相关服务 worker 的日志记录语句。

var CACHE_VERSION = 1;
var CURRENT_CACHES = {
  prefetch: 'prefetch-cache-v' + CACHE_VERSION
};

self.addEventListener('install', function(event) {
  var urlsToPrefetch = [
    './static/pre_fetched.txt',
    './static/pre_fetched.html',
    'https://www.chromium.org/_/rsrc/1302286216006/config/customLogo.gif'
  ];

  console.log('处理安装事件。要预取的资源:', urlsToPrefetch);

  event.waitUntil(
    caches.open(CURRENT_CACHES['prefetch']).then(function(cache) {
      cache.addAll(urlsToPrefetch.map(function(urlToPrefetch) {
        return new Request(urlToPrefetch, {mode: 'no-cors'});
      })).then(function() {
        console.log('已获取并缓存所有资源。');
      });
    }).catch(function(error) {
      console.error('预取失败:', error);
    })
  );
});

重要:获取资源时,如果资源是由不支持 CORS 的服务器提供服务的话,使用 {mode: 'no-cors'} 非常重要。在该实例中,www.chromium.org 不支持 CORS。

规范

规范 状态 备注
Service Workers
ExtendableEvent 的定义
编者的草案 初始定义。

桌面浏览器兼容性

特性 Chrome Edge Firefox Internet Explorer Opera Safari
基础支持 40 17 441 不支持 24 不支持
ExtendableEvent() constructor 40 17 441 不支持 24 不支持
waitUntil 40 17 44 不支持 24 不支持

移动浏览器兼容性

特性 Android Chrome for Android Edge mobile Firefox for Android IE mobile Opera Android iOS Safari
基础支持 40 40 不支持 44 未知 24 不支持
ExtendableEvent() constructor 40 40 不支持 44 未知 24 不支持
waitUntil 40 40 不支持 44 未知 24 不支持

1. Firefox 45 和 52 扩展支持版本(ESR)中已禁用服务 worker(和推送)。

相关链接