问题描述
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
解析发生在运行时)。