大家好,
我们的团队负责 Discourse 论坛,目前发现 Chrome 浏览器上存在重复请求的问题,而 Firefox 和 Safari 则未出现此情况。我怀疑该问题与服务 Worker 及 Workbox 有关。
当前的配置情况如下:
- 我们有一个主域名:https://example.com
- 脚本托管在子路径下:https://example.com/assets/myScript.js
- myScript 会向外部端点发起 GET 请求:https://foobar.com/
问题描述:
- 首次访问论坛(或进行硬刷新)时,浏览器仅发送一次请求。
- 第二次请求时,浏览器会发送两次请求:一次来自服务 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,因此也需要在此环境中进行相应暴露。