HTML5 Service Worker:生命周期、持久化和代码加载
HTML5 Service Workers: Life Cycle, Persistence, and Code Loading
我希望我的网络应用偶尔在用户的桌面上显示通知。 GMail 和 Facebook 使用相同的技术。
使用 HTML5 通知 API 获得用户的许可并随后显示通知的方法非常简单明了。但就我而言,即使他没有浏览我的网站,我也想向用户显示这些通知。我的研究将我指向 Service Worker API。我已经 运行 学习了一些 Service Worker 教程,虽然我理解了大部分内容,但我仍然有以下问题:
(1) 我了解下载=>安装=>激活周期,但我无法准确了解先前安装的服务工作线程何时启动或关闭。我发现的唯一相关引用说线程 "can be started and shutdown at any time." 虽然那是一篇旧文章。我们现在了解更多了吗?具体来说:线程是否在用户启动计算机时启动?还是在用户开机后第一次打开浏览器时启动? etc... 同样,线程什么时候关闭?可以想象它会保持关闭状态几分钟吗?小时?天?
(2) 如何持久化一个值?无需详细说明,我需要在显示通知后在用户计算机上保留一个 32 位值。这就是我需要的 "state" 信息的范围。但出于未知原因,文章指出 localStorage 无法通过 Service Worker 上下文使用。那我应该如何存储这个值呢?
(3) 我的 Service Worker 代码将依赖于我创建的另一个对象,该对象位于 'utils.js.' 我如何将它加载到内存中以便我的 Service Worker 可以看到它?在我的网络应用程序中,我可以使用 HTML 中的 <script>
标记来执行此操作。但在这种情况下,没有 HTML——只有 JavaScript。那么我该如何告诉 Service Worker 将这段代码加载到内存中呢?
(4) 如何调试我的 Service Worker?使用标准网络应用程序,我可以在 Chrome 中按 Alt-Cmd-I 打开调试面板。但在这种情况下,我不是在调试特定站点——我是在调试 Service Worker 线程。
谢谢,
非斯都
- 在某些事件发生之前,服务工作者线程不会再次执行。在您的情况下,您希望在
push
事件发生时执行您的服务工作者,即当您的服务器向客户端发送通知时。
- 您可以使用 IndexedDB(localForage 是一个基于 IndexedDB 的简单库,实现了类似于 localStorage 的接口)。
- importScripts.
- Firefox 中的开发人员工具仍在开发中(您可以在某些版本的 Firefox 中使用 about:serviceworkers 和 about:debugging),在 Chrome 中您可以在开发人员中看到服务工作者源和资源选项卡之间的面板(您也可以从那里模拟推送事件):https://www.chromium.org/blink/serviceworker/service-worker-faq
上有一些使用 Web 推送 API 的示例
我希望我的网络应用偶尔在用户的桌面上显示通知。 GMail 和 Facebook 使用相同的技术。
使用 HTML5 通知 API 获得用户的许可并随后显示通知的方法非常简单明了。但就我而言,即使他没有浏览我的网站,我也想向用户显示这些通知。我的研究将我指向 Service Worker API。我已经 运行 学习了一些 Service Worker 教程,虽然我理解了大部分内容,但我仍然有以下问题:
(1) 我了解下载=>安装=>激活周期,但我无法准确了解先前安装的服务工作线程何时启动或关闭。我发现的唯一相关引用说线程 "can be started and shutdown at any time." 虽然那是一篇旧文章。我们现在了解更多了吗?具体来说:线程是否在用户启动计算机时启动?还是在用户开机后第一次打开浏览器时启动? etc... 同样,线程什么时候关闭?可以想象它会保持关闭状态几分钟吗?小时?天?
(2) 如何持久化一个值?无需详细说明,我需要在显示通知后在用户计算机上保留一个 32 位值。这就是我需要的 "state" 信息的范围。但出于未知原因,文章指出 localStorage 无法通过 Service Worker 上下文使用。那我应该如何存储这个值呢?
(3) 我的 Service Worker 代码将依赖于我创建的另一个对象,该对象位于 'utils.js.' 我如何将它加载到内存中以便我的 Service Worker 可以看到它?在我的网络应用程序中,我可以使用 HTML 中的 <script>
标记来执行此操作。但在这种情况下,没有 HTML——只有 JavaScript。那么我该如何告诉 Service Worker 将这段代码加载到内存中呢?
(4) 如何调试我的 Service Worker?使用标准网络应用程序,我可以在 Chrome 中按 Alt-Cmd-I 打开调试面板。但在这种情况下,我不是在调试特定站点——我是在调试 Service Worker 线程。
谢谢,
非斯都
- 在某些事件发生之前,服务工作者线程不会再次执行。在您的情况下,您希望在
push
事件发生时执行您的服务工作者,即当您的服务器向客户端发送通知时。 - 您可以使用 IndexedDB(localForage 是一个基于 IndexedDB 的简单库,实现了类似于 localStorage 的接口)。
- importScripts.
- Firefox 中的开发人员工具仍在开发中(您可以在某些版本的 Firefox 中使用 about:serviceworkers 和 about:debugging),在 Chrome 中您可以在开发人员中看到服务工作者源和资源选项卡之间的面板(您也可以从那里模拟推送事件):https://www.chromium.org/blink/serviceworker/service-worker-faq