Chrome 中的重复请求

大家好,

我们的团队负责 Discourse 论坛,目前发现 Chrome 浏览器上存在重复请求的问题,而 Firefox 和 Safari 则未出现此情况。我怀疑该问题与服务 Worker 及 Workbox 有关。

当前的配置情况如下:

  1. 我们有一个主域名:https://example.com
  2. 脚本托管在子路径下:https://example.com/assets/myScript.js
  3. myScript 会向外部端点发起 GET 请求:https://foobar.com/

问题描述:

  1. 首次访问论坛(或进行硬刷新)时,浏览器仅发送一次请求。
  2. 第二次请求时,浏览器会发送两次请求:一次来自服务 Worker 提供的文件,另一次来自 fetchWrapper.mjs(参考:workbox/packages/workbox-core/_private/fetchWrapper.mjs at 194cdeb63d5abb21490f88f01f02f4bcf7e6d54b · GoogleChrome/workbox · GitHub

附加信息:
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/service-worker.js.erb#L18-L35 这是负责创建服务 Worker 的配置,它采用了“网络优先”策略。

如何解决?
类似于认证配置(参考:https://github.com/discourse/discourse/blob/master/app/assets/javascripts/service-worker.js.erb#L10),我们可以将 /analytics/ 暴露为一个路由,或者允许用户配置一个自定义路由数组,并将其设置为 NetworkOnly 策略。我们的部署环境基于 Docker 和 EC2,因此也需要在此环境中进行相应暴露。

你确定这两个请求都实际触发了网络吗?第二个请求很可能只是用来响应第一个请求的。

是的。在我们的设置中,这会影响我们的分析代码,导致分析数据被重复计算。

这些并非重复请求,只是 Chrome 开发者工具显示服务工作者代理时的一种特性。

此外,您可以检查应用程序日志,确认服务器并未收到针对任何路由(如 /latest.json)的重复请求。

因此,这并非 Discourse 的缺陷。

非常感谢各位团队。这确实是 Chrome 的一个特性问题:Chrome 会显示多次请求,而数据实际上已经去重。