【问题标题】:Find jQuery cache hit/miss from CDN从 CDN 中查找 jQuery 缓存命中/未命中
【发布时间】:2019-04-13 11:55:07
【问题描述】:

如果您包含来自 CDN 的 jQuery,有没有办法确定用户是从 CDN 获取内容还是从他们的缓存中检索内容?

显然缓存命中不会发出 HTTP 请求,但您能否对其进行测试并将 Javascript 与数据一起报告回您自己的服务器?

【问题讨论】:

  • 这是干什么用的?我只是在想,如果您每次可以将当前时间戳添加为查询字符串变量时都想从 http req 中检索,这应该会强制它再次下载。例如。 <script src="http://some.cdn.com/myscript.js?v=123456789"></script>
  • 我想看看从 CDN 加载 jQuery 是否值得。最好有实际数据而不是推测缓存中有 jQuery 的用户百分比。
  • 哦,我明白了 :) 很公平。
  • 想知道您是否可以对应缓存的资源发出异步请求,然后立即尝试从中请求变量...仅当脚本从文件系统加载时才有效。
  • 对我和其他至少 7 个人来说听起来像是一个有趣的练习 :-) 你有没有得到任何统计数据?

标签: javascript jquery cdn


【解决方案1】:

为什么不直接使用 CHARLES 或类似的调试代理来确定加载速度?

如果您想从客户的角度了解多个位置的速度,请将http://www.webpagetest.org/ 与您网站的两个不同版本(一个使用 CDN,一个使用自托管静态位置)并比较加载速度。就个人而言,除非您有大量自定义 javascript 代码,否则为 jQuery 使用 CDN 是有意义的,尤其是因为很多网站都使用 Google Libraries API for jQuery。

【讨论】:

    【解决方案2】:

    如果您已登录 CDN(我们似乎没有?)您可以更改 CDN url 以进行测试运行,并在您的服务器上使用 pingback url。在一段时间内,将 ping back url 点击次数和时间与您的 CDN url 点击次数和唯一访问者计数进行比较。

    您应该能够了解在您的 cdn url 上获得了多少独特的点击量与在您的页面上获得了多少独特的点击量。区别应该是机器人、爬虫和缓存或资源加载失败。您可以消除的机器人,可能还有爬虫,因此您的 %ages 应该在足够长的时间内反映。

    这对你有用吗?

    我们在非 CDN 资源上执行此操作,以查看人们是否正在下载最新的 CSS 文件,或者仅在对 CSS 文件进行更改后似乎已缓存资源的那些 IP 上强制更改名称。

    【讨论】:

    • 它可以工作,但我正在考虑使用谷歌的CDN;我们将无法从中登录。
    • 不,但测试会告诉您一般有多少使用缓存,这对于知道有多少使用来自谷歌的 CDN 可能同样有效?除此之外,这是一个很好的观点——不知道你会怎么做。
    【解决方案3】:

    如果不使用 ajax,测试 304(未修改)会很困难。除非您在 CDN 上绕过同源策略,否则使用 ajax 将非常困难。

    我假设您想测试脚本加载并在客户端上可用的实际时间,并且想比较使用 CDN 和本地数据的数据。如果是这样,测试实际时间而不是做一些缓存测试不是更好吗?

    设置脚本加载实际时间的 A/B 测试相当容易。

    对于 A 测试,您可以进行 CDN/本地分离

    <script>var _time = new Date().getTime();</script>
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script src="project.js"></script>
    <script>_time = new Date().getTime() - _time;</script>
    

    B 测试本地脚本合并或其他:

    <script>var _time = new Date().getTime();</script>
    <script src="project.includingjquery.min.js"></script>
    <script>_time = new Date().getTime() - _time;</script>
    

    然后使用 ajax 将 _time 变量报告到分析或您自己的数据库中。如果 B 用户报告的 _time 较低,那么您知道这是正确的方法...

    【讨论】:

      【解决方案4】:

      如果您愿意向页面添加一些批量来测试这一点,您可以向 jQuery 的 CDN 添加 ajax 请求,然后检查标头是否有 304 响应。然后,如果您创建第二个 ajax 请求以 ping 回您的服务器,告诉您 jQuery 是否被缓存,即它是 200 还是 304 响应。我没有尝试过,但它应该可以工作,但它会为您的用户添加一些额外的请求,但考虑到它们将是异步的,它可能不会产生任何影响。

      【讨论】:

      • 该死的发布后我意识到这将不起作用,除非您使用的 CDN 具有访问控制标头以允许跨域 ajax 请求?有谁知道是否有任何 CDN 设置了 Access-Control-Allow-Origin 标头?
      • 遗憾的是,jQuery 下载页面上列出的三个 CDN(Google、Microsoft 和 jQuery 自己的)都不支持 Access-Control-Allow-Origin 标头。
      【解决方案5】:
      <script>var s=new Date().getTime();</script>
      <script src="cdncontent"></script>
      <script>
      var s = new Date().getTime() - s;
      if (s < 100) {
        //likely from cache
      } else {
        //likely from CDN
      }
      </script>

      【讨论】:

      • 25ms 的时间只是一个猜测,您不太可能在 25ms 内真正连接、请求和下载给定的文件,但 应该 足以加载/parse from local...您可能需要稍微调整/测试一下。
      【解决方案6】:

      从 CDN 加载资源总是值得的。唯一的缺点是 CDN 在地理位置上是否靠近用户。您需要检查您的目标受众并决定是否更好地使用它。在 jquery 的情况下,我总是使用我认为可靠且健壮的 Google CDN。

      【讨论】:

      • 这个答案没有附加数据。例如,现在我们将缩小的 jQuery 与其他 Javascript 捆绑在一个文件中。拆分 jQuery 将涉及额外的 HTTP 请求。除非我知道有多少用户已经在缓存中拥有该文件,否则我无法评估这种权衡。
      • 无论如何,每个元素都会有一个额外的请求,最大的区别在于向同一服务器或不同服务器发出请求。假设您在同一台服务器中拥有两种资源,您的服务器会收到 2 个请求,但它会一个接一个地提供服务。另一方面,如果您有 2 个资源来自不同的服务器,理想情况下,这两个资源将同时提供服务,因此可以快速显示。
      • 这个答案做出了错误的假设。将 jQuery 源代码与其他脚本一起压缩到一个文件/请求中比提供两个请求更快,无论它们位于何处。
      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2018-11-02
      • 1970-01-01
      • 2021-01-12
      • 2014-02-24
      相关资源
      最近更新 更多