草庐IT

javascript - 禁用缓存后,Chrome CORS 请求会更快吗?

coder 2024-07-15 原文

我的应用在此处加载视频:https://core.arc.io/guanzo/VideoOfPeopleWalking.mp4

它使用 Range 请求 header 以 16Kb 的 block 从另一个来源加载视频。我的服务器设置了响应头 Access-Control-Max-Age 到 10 分钟以防止冗余的 OPTIONS 请求。

访问链接(它是一个 HTML 页面),打开网络工具,观察到获取一个 16Kb block 大约需要 1 秒。

现在检查“禁用缓存”,您应该会看到请求完成得更快,并且看起来有更多的并发请求。这与预期行为相反,因为每个请求都必须触发并等待 OPTIONS 请求。

如果启用了缓存,请求应该会更快,不是吗?这是怎么回事?

这是 GIF 格式的复制品:https://i.gyazo.com/ec5941829031cdd4dc684a3b53ec6c39.mp4

注意: block 存储在 IndexedDB 中,因此如果您刷新页面,则需要清除 IndexedDB 以强制触发所有请求。

编辑:过滤掉所有 firestore 请求,我不确定为什么会触发这些请求,但它应该与我的问题无关。

编辑:一条新线索! https://i.gyazo.com/bd887533a42868f748564ccda4451881.png

选中“禁用缓存”后,Chrome 将重用“连接 ID”列中显示的相同 TCP 连接。从表面上看,这应该使请求更快。

最佳答案

深吸一口气,同时从调试兔子洞中探出头来。

这是一种有很多解决方案的问题。

问题:

Chrome 认为每个范围请求都在请求“相同”的资源,因为 URL 是相同的。它在技术上不是“相同”资源,因为请求的字节范围不同,如 Content-Range header 中指定的那样。

这是来自 chromium docs 的引述关于 http 缓存如何处理具有相同 URL 的请求。

Enforce the cache lock.

The cache implements a single writer - multiple reader lock so that only one network request for the same resource is in flight at any given time.

Note that the existence of the cache lock means that no bandwidth is wasted re-fetching the same resource simultaneously. On the other hand, it forces requests to wait until a previous request finishes downloading a resource...

如果您在我的示例中打开每个网络请求中的“计时”选项卡,您会看到每个请求都在等待前一个请求完成。

解决方案:

强制 Chrome 识别范围请求正在返回不同的资源。

这可以通过在请求或响应上设置 header Cache-Control: no-cache, no-store 来完成。根据请求设置时,性能改进最高。其他 header 值可能会起作用,我只测试了 no-cache, no-store。这解释了为什么选中“禁用缓存”使我的请求变得如此快,每个请求都能够使用不同的 TCP 连接并且不会被缓存锁停滞。

我想支持这个 SO question给了我“啊哈!”时刻,感谢 Firefox 没有这个问题。

关于javascript - 禁用缓存后,Chrome CORS 请求会更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52349984/

有关javascript - 禁用缓存后,Chrome CORS 请求会更快吗?的更多相关文章

  1. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  2. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  5. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  6. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  9. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  10. ruby - 如何更快地解决 project euler #21? - 2

    原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,

随机推荐