注册服务工作者的大多数示例都是通过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"
}
这是我所见过的唯一这个地方。
这为我提出了两个问题:
清单方法的声明性好处是显而易见的,但如果我使用该方法,如何引用注册对象以跟踪类似于脚本方法的事件? (安装 | 等待 | 有效 | 失败)。
假设可以适当地引用注册对象,它是否会错过事件?比如在我可以注册事件监听器之前完成安装。
由于清单将保存在脱机缓存中,并且此清单将引用service-worker脚本,缓存含义是什么?假设我不将脚本存储在脱机缓存中,24小时规则是否仍然适用? update_via_cache
成员在规范中读取并不是一件简单的事。
答案 0 :(得分:1)
它看起来已添加到规范back in October of 2016中,issue tracker中有一些背景讨论。
我的解释是该用例提供了服务工作者引导元数据,该元数据在通过非浏览器机制安装Web应用程序时是相关的,例如,通过应用商店。但是,我在guidance中没有看到关于Microsoft Store提取的那个字段。
所以...截至目前,我不清楚任何浏览器是否尊重Web应用程序清单中的serviceworker
字段,以及您是否关注“浏览器”用例的功能服务工作者注册,使用JavaScript。
您跟进的最佳选择是在网络应用清单上GitHub issue tracker询问。