代码之家  ›  专栏  ›  技术社区  ›  thedarklord47

javascript:有什么方法可以检查浏览器缓存中是否存在资产?

  •  1
  • thedarklord47  · 技术社区  · 8 年前

    我正在尝试优化我的网页包包大小。看看我的供应商包,最大的块是reactdom+react。

    我想我可以利用Webpack的 externals 配置选项,让cdn像我目前使用jquery那样为这些资产提供服务。但我检查了一下,我的个人浏览器并没有缓存这些资产,所以我开始怀疑其他人是否会缓存这些资产。如果大多数人还没有缓存这些资产,那么由于额外的往返行程,从外部加载这些资产弊大于利。

    是否有人知道跨浏览器解决方案,用于检查资产当前是否已缓存?这样,我可以在我的用户基础上生成一些分析,看看将这些更大的资产外部化是否是一个好的举措。

    我见过 Cache 大多数现代浏览器的api。不过,我还是需要一个Safari/IE的解决方案。

    2 回复  |  直到 8 年前
        1
  •  0
  •   Jonas Wilms    8 年前

    由于事实 script files are loaded in order 你可以在反应前后花点时间,包括。如果该时间低于几毫秒,则它来自缓存,并且该时间正好是解析所需的时间,否则它是从服务器加载的,并且ypu得到网络延迟:

    <script>
      var start = Date.now();
     </script>
     <script src="cdn/react.min.js" ></script>
     <script>
       var loadTime = Date.now() - start;
       // Do whatever with that
       if(loadTime < 10) alert("cached");
    </script>
    

    但是,对于非常慢的浏览器和高速用户,您可能会得到错误的肯定和否定

        2
  •  0
  •   Sujoy Chatterjee    7 年前

    您可以使用 Resource Timing API 查找加载的所有资源和 transferSize 属性来确定是否从缓存加载。传输大小为0表示缓存加载。大于0表示通过网络的实际传输,因此是未缓存的资源。

    const resourcesStatus = window.performance.getEntriesByType('resource')
      .reduce(function(formattedOutput, resourceDetails) {
        return formattedOutput.concat({
          resourceName: resourceDetails.name,
          cached: resourceDetails.transferSize ? false : true
        })}, [])