改善 Service Worker 的开发体验

Service Worker 生命周期可确保安装和更新过程可预测, 这会使本地开发周期略微微妙。

在典型的本地开发周期中,开发者将对文件所做的更改保存到文本编辑器中, 然后切换到浏览器以验证更改,系统会重复此过程。 当混合使用一个 Service Worker 时,这个循环大致是相同的, 但开发者的期望和浏览器的行为可能会有所不同。

本地开发的例外情况

一般来说,Service Worker API 仅适用于通过 HTTPS 提供的页面, 但也有一些例外情况,在这些情况下,可以通过 HTTP 协议使用 HTTP 协议。 有一项值得注意的例外情况,那就是通过 localhost 提供的网页,这种格式非常适合本地开发。

然而,除了 localhosthosts 文件。 如果多个项目需要单独的主机名,则在本地开发环境中需要执行此操作。 在这些情况下,可以预配自签名证书。

一种更方便的解决方法是指示浏览器允许 Service Worker 测试例外。 对于 Chrome,请前往 chrome://flags/#unsafely-treat-insecure-origin-as-secure 并指定不安全的源以被视为安全源。 Firefox 提供了一种方法,可通过 about:config 中的 devtools.serviceWorkers.testing.enabled 设置在不安全的源上测试 Service Worker。

Service Worker 开发辅助工具

混合使用 Service Worker 的本地开发可能会导致看似意外的行为。 例如,假设针对无版本控制的静态资产采用“仅缓存”策略,或者采用预缓存的“你处于离线状态”策略更改后,系统会在重新加载时更新该网页。 由于这些资源的过时版本始终通过 Cache 实例提供, 它们似乎从未更新! 令人失望的是,Service Worker 只能执行其构建用途, 但有些方法可以简化测试

目前为止,测试 Service Worker 的最有效方法是依靠无痕浏览窗口,例如 Chrome 中的无痕式窗口, 或 Firefox 的隐私浏览功能。 每次您打开无痕浏览窗口时,都是全新的。 没有活跃的 Service Worker,也没有打开的 Cache 实例。此类测试的例程如下:

  1. 打开无痕浏览窗口。
  2. 导航到注册 Service Worker 的页面。
  3. 验证 Service Worker 的行为是否符合您的预期。
  4. 关闭无痕式窗口。
  5. 重复。

通过此过程,您可以真实地模拟 Service Worker 的生命周期。

Chrome 开发者工具的 Application 面板中提供的其他测试工具 可以有所帮助 - 但它们可以通过某些方式修改 Service Worker 的生命周期。

Chrome DevTools Application 面板。

应用面板包含一个标记为 Service Workers 的子面板, 其中显示了当前页面的活跃 Service Worker。 每个活跃的 Service Worker 都可以手动更新,甚至可以全部取消注册。 顶部还提供了三个有助于开发工作的切换开关。

  1. 离线功能会模拟离线情况。这有助于测试活跃的 Service Worker 是否提供离线内容。
  2. Update on reload:切换后,每当页面重新加载时,都会重新获取并替换当前的 Service Worker。
  3. 绕过网络,当此设置处于切换状态时,系统会绕过 Service Worker 的 fetch 事件中的任何代码,并始终从网络获取内容。

这些是有用的切换开关,尤其是绕过网络, 当您使用活跃的 Service Worker 开发项目时,这会非常有用, 但又想确保体验在没有 Service Worker 的情况下也能按预期运行。

Firefox 的开发者工具中也有类似的应用面板, 但该功能仅限于显示已安装的 Service Worker, 还可以手动取消注册当前页面的任何活跃 Service Worker。 它同样有用,但在本地开发周期中确实需要更多的手动工作。

Shift 并重新加载

如果使用活跃的 Service Worker 进行本地开发,而不需要“刷新时更新”或“绕过网络”提供的功能,那么按住 Shift 键并按刷新按钮也十分有用。

这称为强制刷新,会绕过网络的 HTTP 缓存。 当 Service Worker 处于活动状态时,强制刷新也将完全绕过 Service Worker。

如果对特定缓存策略能否按预期运行存在不确定性,此功能非常有用, 从网络中获取所有内容,以比较有没有 Service Worker 和没有 Service Worker 时的行为,这非常有用。 更棒的是,这是一种指定的行为,因此支持 Service Worker 的所有浏览器都会观察它。

检查缓存内容

如果无法检查缓存,则很难判断缓存策略是否按预期运行。 当然,可以在代码中检查缓存, 但这是一个涉及调试程序和/或 console 语句的过程,此时可视化工具更适合该任务。 Chrome DevTools 中的 Application 面板提供了一个子面板,用于检查 Cache 实例的内容。

在开发者工具中检查缓存

此子面板通过提供如下功能来简化 Service Worker 的开发:

  • 查看 Cache 实例的名称。
  • 能够检查已缓存资源的响应正文及其关联的响应标头。
  • 您可以从缓存中逐出一项或多项,甚至删除整个 Cache 实例。

这种图形界面有助于更轻松地检查 Service Worker 缓存,以了解是否从 Service Worker 缓存完全添加、更新或移除了项目。Firefox 自带具有类似功能的缓存查看器,不过它位于单独的存储面板中。

模拟存储空间配额

在包含大量大型静态资源(例如高分辨率图片)的网站上, 就有可能会达到存储空间配额出现这种情况时 浏览器会从缓存中删除它认为已过时或值得牺牲的项,以便为新资产腾出空间。

存储配额的处理应该是 Service Worker 开发的一部分, Workbox 能比自行管理管理流程更简单。 但无论是否使用 Workbox,都适合通过模拟自定义存储空间配额来测试缓存管理逻辑。

存储空间用量查看器。
Chrome 开发者工具的 Application 面板中的存储空间使用情况查看器。这里,正在设置自定义存储空间配额。

Chrome 开发者工具中的“Application”面板有一个 Storage 子面板,显示当前使用了多少存储空间配额的信息。 它还允许以 MB 为单位指定自定义配额。 生效后,Chrome 将强制执行自定义存储空间配额,以便您进行测试。

顺便说一句,此子面板还包含一个清除网站数据按钮,以及一系列关联复选框,用于供用户点击该按钮时清除的内容。 其中包括所有打开的 Cache 实例,以及能够取消注册控制该页面的任何活跃 Service Worker。

开发更轻松,工作效率更高

开发者如果能摆脱困境,就能更自信地开展工作,提高工作效率。 使用 Service Worker 进行本地开发可能会很微妙,但不必那么痛苦。 有了这些提示和技巧,通过活跃的 Service Worker 进行开发应该变得更加透明和可预测, 从而带来更好的开发者体验