服务工作进程应该在清单中注册还是通过脚本注册?



大多数注册服务工作者的例子都是通过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 应用清单标准中有一个serviceworker成员:

"serviceworker": {
"src": "sw.js",
"scope": "/",
"update_via_cache": "none"
}

这是我唯一看到过的地方。

这给我带来了两个问题:

1 我应该使用哪种方法?有什么权衡?

清单方法的声明性优势是显而易见的,但是如果我使用该方法,如何引用注册对象以跟踪类似于脚本方法的事件?(安装|等待|活跃|失败(。

假设可以适当地引用注册对象,它会错过事件吗?例如,在我可以向其注册事件侦听器之前完成安装。

2 缓存的含义是什么

由于清单将保存在脱机缓存中,并且此清单将引用服务工作进程脚本,因此缓存的含义是什么?假设我不将脚本存储在脱机缓存中,24 小时规则是否仍然适用?update_via_cache成员在规范中阅读并不是一件简单的事情。

看起来它是在 2016 年 10 月添加到规范中的,并且在问题跟踪器中有一些背景讨论。

我的解释是,用例是提供服务工作者引导元数据,这些元数据在通过非浏览器机制(例如通过应用商店(安装 Web 应用程序时是相关的。不过,我在有关Microsoft存储引入的指南中没有看到任何提及该字段的内容。

所以......截至目前,我不清楚是否有任何浏览器尊重 Web 应用程序清单中的serviceworker字段,如果您担心的是让功能服务工作者注册"浏览器"用例,请使用 JavaScript 进行注册。

跟进的最佳选择是在 Web 应用程序清单的 GitHub 问题跟踪器上询问。

最新更新