我可以从 Service Worker 注册中得到实际错误吗?

问题描述

例如,如果我有这样的代码

script.js

// ...
try {
  const serviceWorkerRegistration = await navigator.serviceWorker.register('/serviceWorker.js');
  await serviceWorkerRegistration.update();
  // ...
} catch (e) {
  console.error(e); // here I want to get an actual error
}
// ...

serviceWorker.js

// ...
ddd; // the line with an error
// ...

我能否在 Uncaught ReferenceError: ddd is not defined 而不是 script.js 中获得实际错误 (TypeError: Failed to update a ServiceWorker for scope (...) ServiceWorker script evaluation Failed)?我的代码比较复杂,我在我的 Sentry 项目中看到有些浏览器无法解析 Service Worker 脚本,但我想了解这种情况的原因。另外,我将 Sentry 客户端添加到了我的 Service Worker,但无论如何,在注册之前可能会抛出错误

解决方法

如果有些浏览器无法解析您的代码,那么它实际上只是将您的代码转换为以前版本的 javascript。但是,如果这些是您正在运行的测试,那么您就有了将代码封装在 eval 中的开发版本。

简单说一下:

Uncaught ReferenceError: ddd is not defined

是运行时错误。当引擎解析你的脚本时,它不应该被抛出。但是,如果您有以下情况:

let [test] = [ddd]

如果您的引擎不理解 ES6 解构(即使 ddd 不存在),您很可能会收到语法错误。

这个:

ddd

可以像这样在 service worker 脚本中捕获

self.onerror = e => console.error(e);
ddd;

但是如果它像这样解析失败......那么它就行不通了:

self.onerror = e => console.error(e);
if(

但是,如果您将其包装在 eval 中:

self.onerror = e => console.error(e);
eval('if(');

然后这项工作(因为 eval 解析发生在运行时)。