大多数注册 Service worker 的示例都是通过 JavaScript 完成的。例如(来自 MDN ):
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) {
// Something went wrong during registration. The service-worker.js file
// might be unavailable or contain a syntax error.
});
} else {
// The current browser doesn't support service workers.
}
但我注意到在 Web App Manifest standard有一个 serviceworker
成员:
"serviceworker": {
"src": "sw.js",
"scope": "/",
"update_via_cache": "none"
}
这是我唯一看到的地方。
这给我提出了两个问题:
1 我应该使用哪种方法?有哪些权衡取舍?
list 方法的声明性好处是显而易见的,但如果我使用该方法,我如何引用注册对象以便跟踪类似于脚本方法的事件? (正在安装 | 等待 | 激活 | 失败)。
假设可以适本地引用注册对象,它会错过事件吗?比如在我可以注册一个事件监听器之前完成安装。
2 缓存的含义是什么
由于 list 将保存在离线缓存中,并且该 list 将引用服务 worker 脚本,那么缓存有何影响?如果我不将脚本存储在离线缓存中,24 小时规则是否仍然适用? update_via_cache
成员在规范中不是一件容易阅读的东西。
最佳答案
看起来它已添加到规范中 back in October of 2016 ,并且在 issue tracker 中有一些背景讨论。 .
我的解释是,用例提供服务 worker 引导元数据,这在通过非浏览器机制安装网络应用程序时是相关的,例如通过应用商店。我在 guidance 中没有看到该字段的任何提及不过,关于 Microsoft Store 摄取。
所以...截至目前,我不清楚是否有任何浏览器支持 Web 应用程序 list 中的 serviceworker
字段,如果您担心的是为“浏览器”注册功能性服务 worker "用例,使用 JavaScript 来完成。
跟进的最佳选择是在网络应用程序 list 的 GitHub issue tracker 上询问.
关于service-worker - Service Worker 应该在 list 中注册还是通过脚本注册?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50309263/