【问题标题】:ServiceWorker fails on hard reload (Ctrl-Shift-R) in ChromeServiceWorker 在 Chrome 中的硬重新加载 (Ctrl-Shift-R) 失败
【发布时间】:2018-03-01 16:26:23
【问题描述】:

为什么 Service Worker 在硬重新加载 (Ctrl-Shift-R) 后会失败?

---- case 1 CHROME --- 成功

  1. 卸载 service worker
  2. 加载页面
  3. 页面安装 service worker
  4. Worker.postMessage() 成功
  5. 重新加载页面
  6. Worker.postMessage() 成功

---- case 2 CHROME --- 失败

  1. 卸载 service worker
  2. 加载页面
  3. 页面安装 service worker
  4. Worker.postMessage() 成功
  5. HARD RELOAD (ctrl-shift-R) 页面(serviceworker 仍然根据 chrome://serviceworker-internals/ 运行)
  6. Worker.postMessage() 失败 -- '错误发送类型错误:无法读取属性'postMessage' of null'

【问题讨论】:

    标签: service-worker


    【解决方案1】:

    当你 shift-reload 时,重新加载的页面will not be controlled by a service worker。这是服务工作者规范的一部分。

    这仅适用于下一页加载。假设页面在 1 范围内,未来的页面加载(不涉及 shift-reload)将继续由 service worker 控制。

    【讨论】:

    • 对于需要频繁刷新资源的 Web 开发人员来说,这有点麻烦
    • 我认为这个“功能”已经把我搞砸了很多年。更糟糕的是,开发工具显示 Service Worker 已激活并正在运行!这解释了很多随机损坏。非常感谢您的回答!
    【解决方案2】:

    在开发过程中,您可以使用例如 Chrome 的 Dev-Tools 并设置服务工作者在每次重新加载时更新:

    如需进一步参考,您可以阅读 Googles Web Essentials 关于此主题的内容。

    【讨论】:

    • 这很有帮助,但如果我的 serviceworker 控制器为空(我认为这是唯一的选择),我最终会重新加载页面
    • 出于兴趣,您是通过navigator.serviceWorker.controller查看还是仅通过navigator.serviceWorker查看?
    • 我检查 navigator.serviceWorker.controller 是否为空 -- 如果是则重新加载
    • 谢谢!我也这样做,但只有在最初打开页面后手动重新加载后才能获得可用的结果。你有什么提示吗?
    • 是的,这是预期的行为 - 非常感谢!我遵循了solved question at SO 的解决方案,在该解决方案中,无需等待即可安装服务工作者,并自行对所有打开的页面可用。像魅力一样工作。
    猜你喜欢
    • 2014-02-20
    • 2021-02-16
    • 2015-07-30
    • 1970-01-01
    • 2020-08-15
    • 2010-10-25
    • 2016-04-12
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多