注册 ServiceWorker 返回 AbortError code:20

Posted

技术标签:

【中文标题】注册 ServiceWorker 返回 AbortError code:20【英文标题】:Registering ServiceWorker returns AbortError code:20 【发布时间】:2014-11-23 08:30:31 【问题描述】:

我已经开始在 Google Chrome v38 中使用 ServiceWorker。我已将about:config 中的#enable-experimental-web-platform-features 设置为True,并设置我的本地主机以通过https:// 处理请求。

我的sw.js 文件包含简单示例:

// The SW will be shutdown when not in use to save memory,
// be aware that any global state is likely to disappear
console.log("SW startup");

self.addEventListener('install', function(event) 
  console.log("SW installed");
);

self.addEventListener('activate', function(event) 
  console.log("SW activated");
);

self.addEventListener('fetch', function(event) 
  console.log("Caught a fetch!");
  event.respondWith(new Response("Hello world!"));
);

还有我的app.js 文件:

if ('serviceWorker' in navigator) 
    console.log('registering sw.js');
    navigator.serviceWorker.register('/static/js/sw.js').then(function(reg) 
        console.log('Yey!', reg);
    , function(err) 
        console.log('Boo!', err);
    );

我的控制台输出是:

registering sw.js app.js:27
Boo!
DOMException: The Service Worker installation failed. message: "The Service Worker installation failed.", name: "AbortError", code: 20, INDEX_SIZE_ERR: 1, DOMSTRING_SIZE_ERR: 2… app.js:31

有解决此问题的方法吗?

【问题讨论】:

【参考方案1】:

使用 Service Worker 进行开发时,请使用 Google Chrome 40 或更高版本(无需 chrome://flags 摆弄)。 Chrome 38 可能已经对一些 Service Worker API 提供了一些非常非常初步的支持,但是自 Chrome 38 以来,API 的规范和成熟度都发生了显着变化。Chrome 39 也是如此。

理想情况下,出于开发目的,我实际上建议使用当前的Google Chrome Canary (41),因为自 Chrome 40 分支切割以来,错误消息已经有了一些增强,更准确/表达性更强的错误有很大帮助在弄清楚出了什么问题时。

【讨论】:

我使用的是金丝雀 (41),没有修改标志,无法使其在本地工作 (http)。 服务工作者通常只会为通过https服务的页面工作。但是,当与localhost 对抗时,有一项豁免将允许http 访问。如果您在本地测试 Service Worker,请确保您通过 http://localhost:<port> URL 访问受控页面。【参考方案2】:

我收到了一个带有语法错误的 ServiceWorker 的错误。由于 Chrome 甚至没有在 Network 选项卡中记录 service worker 获取,因此需要一段时间才意识到这是原因。

对于遇到此错误的其他人,请尝试使用空 sw.js 的隐身标签。

【讨论】:

【参考方案3】:

此外,Service Workers 的语法错误报告和 Chrome DevTools 支持总体上仍在开发中。在我写这篇文章时,Chrome 42 处于测试阶段。

【讨论】:

以上是关于注册 ServiceWorker 返回 AbortError code:20的主要内容,如果未能解决你的问题,请参考以下文章

注册时的 ServiceWorker MIME 类型错误('text/html')(React)

在浏览器中出现错误 - 无法为范围注册 ServiceWorker

注册 ServiceWorker 失败:脚本具有不受支持的 MIME 类型 ('text/html')

Flutter 无法使用脚本为范围注册 ServiceWorker,该脚本具有不受支持的 MIME 类型

“未捕获(承诺)的DOMException:无法为范围注册ServiceWorker”-脚本资源位于重定向后面,不允许使用

navigator.serviceWorker 从未准备好