提高Javascript加载时间-串联与多个+;隐藏物

提高Javascript加载时间-串联与多个+;隐藏物,javascript,performance,Javascript,Performance,我想知道,对于一个加载了大量javascript(jQuery+jQuery UI+各种其他javascript文件)的页面,以下哪项会带来更好的性能。我已经浏览了YSlow和Google页面速度的大部分内容,但是我对一个特定的细节感到疑惑 对我来说,这里的一个关键点是,我正在工作的网站不在公共网络上;这是一个企业对企业的平台,几乎所有的用户都是重复访问者(因此都有数据缓存,YSlow认为这对于大量访问者来说是不可能的) 首先,YSlow等工具推荐的标准方法是将其连接、压缩,并在页面末尾加载的单

我想知道,对于一个加载了大量javascript(jQuery+jQuery UI+各种其他javascript文件)的页面,以下哪项会带来更好的性能。我已经浏览了YSlow和Google页面速度的大部分内容,但是我对一个特定的细节感到疑惑

对我来说,这里的一个关键点是,我正在工作的网站不在公共网络上;这是一个企业对企业的平台,几乎所有的用户都是重复访问者(因此都有数据缓存,YSlow认为这对于大量访问者来说是不可能的)

首先,YSlow等工具推荐的标准方法是将其连接、压缩,并在页面末尾加载的单个文件中提供。这种方法听起来相当有效,但我认为这里推理的一个关键部分是提高没有缓存数据的用户的性能

我现在的系统是这样的

  • 所有javascript文件都在页面底部进行压缩和加载
  • 所有javascript文件都有很长的缓存过期日期,因此(对于大多数用户)将在缓存中保留很长一段时间
  • 页面只加载所需的javascript文件,而不是加载一个单一的文件,其中大部分都不是必需的
现在,我的理解是,如果javascript文件的缓存过期日期尚未达到,则会立即使用缓存版本;根本没有向服务器发送HTTP请求。如果这是正确的,我会假设拥有多个标记不会导致任何性能损失,因为我在大多数页面上仍然没有任何额外的请求(从上面回忆起,几乎所有用户都填充了缓存)

除此之外,不加载JS意味着浏览器不必解释或执行它不需要的所有额外代码;作为一个B2B应用程序,不幸的是,我们的大多数用户都被IE6及其缓慢的JS引擎所困扰

另一个好处是,当代码更改时,只需要再次获取受影响的文件,而不是整个文件集(当然,只需要获取一次,所以这不是什么好处)

我还研究了在不缓存JS时使用它来允许并行加载JS

具体问题

  • 如果有许多标记,但所有文件都是从本地缓存加载的,并且总体上加载的javascript较少,那么这是否会比同样从缓存加载但包含站点上任何位置所需的所有javascript而不是适当子集的标记快
  • 有没有其他理由选择其中一个而不是另一个
  • 类似的想法是否适用于CSS?(我目前正在使用一种更加单一的CSS方法)

    • 我肯定会采用非整体式方法。不仅在您的情况下,而且通常在您需要更改或重新配置某些内容时,它会为您提供更大的灵活性

      如果对其中一个文件进行更改,则必须合并压缩和交付。如果你是以自动化的方式做这件事,那么你就没事了

      至于浏览器的问题“如果没有达到javascript文件的缓存过期日期,则立即使用缓存版本;根本没有向服务器发送HTTP请求”,我认为存在HTTP请求,但响应为“未修改”。为了确保您应该检查向Web服务器发出的所有请求(使用可用的工具之一)。给出响应后,浏览器使用未修改的资源—js文件或图像或其他


      祝你的B2B好运。

      你尝试过谷歌关闭吗?从我所读到的情况来看,这似乎很有希望

      • -博客帖子

      • -GC的性能

      • -关于javascript的一些提示


      一般来说,请求越少、越大越好,因为浏览器只会对特定域并行执行两个(?)请求

      因此,虽然您说大多数用户都是重复访问者,但当缓存过期时,许多文件将有许多往返,而不是单个文件的往返

      如果您将这一点发挥到极致,并且可能有数千个文件中包含单独的函数,那么很明显,当缓存过期时,这将导致大量请求

      使用单片文件的另一个原因是,当站点的各个部分都有与之相关联的不同javascript块时,当您点击第一个页面时,会再次在缓存中获得该文件,从而保存以后的请求和往返

      如果您担心加载“大”javascript文件的初始命中率,您可以尝试使用下面描述的方法异步加载它:

      无论最终采用哪种方式,请记住,由于您要设置一个遥远的修改日期,因此在对javascript(和CSS)文件进行更改时,您需要更改它们的名称,否则客户端在缓存过期之前都不会接收更改


      PS:使用不同的方法在不同的浏览器上对其进行分析并编写,因为它对那些同样使用缓慢的JS引擎(如IE6:)的用户非常有用,包括删除临时缓存文件以“加速计算机”的隐私和性能工具

      合并和缩小脚本不必是一个繁重的过程。我在单独的文件中编写JavaScript,这些文件间隔很好,便于我阅读,因此更易于维护。但是,我通过一个脚本页面提供服务,该页面将所有脚本组合成一个脚本和一个min
      javascript( 'jquery', 'jquery.ui', 'home-page' );
      
      <script type="text/javascript" src="/js/?files=eNptkFsSgjAMRffCP4zlTVmDi4iQkVwibbEUHzju3UYEHMffc5r05gJnEX8IvisHnnHPQN9cMHZeKThzJOVeex7R3AmEDhQLCEZBLHLMLVhgpaXUikRMXCJbhdTjgNcG59UJyWSVPSh_0lqSSp0KN6XNEZSYwAqt_KoBY-lRRvNblBZrYeHQYdAOpHPS-VeoTpteVFwnNGSLX6ss3uwe1fi-mopg8aqt7P0LzIWwz-T_UCycC2sQavrp-QIsrnKh"></script>
      
      $compressed_js_file_path = $_SERVER['DOCUMENT_ROOT'] . '/cache/js/' . md5( implode( '|', $js_files ) ) . '.js';
      
      if( file_exists( $compressed_js_file_path ) ) {
          echo file_get_contents( $compressed_js_file_path );
      } else {
      
      if( $fh = @fopen( $compressed_js_file_path, 'w' ) ) {
          fwrite( $fh, $js );
          fclose( $fh );
      }
      
      // Echo the compressed Javascript
      echo $js;
      
      <html>
      <!-- all your HTML content... -->
      <script src="jquery.js"></script>
      <script src="jquery-ui.js"></script>
      <script src="mycode.js"></script>
      
      <html>
      <!-- all your HTML content... -->
      
      <script>var startTime = new Date().getTime();</script>
      
      <script src="jquery.js"></script>
      <script src="jquery-ui.js"></script>
      <script src="mycode.js"></script>
      
      <script>
      var endTime = new Date().getTime();
      var totalTime = endTime - startTime; // In milliseconds
      new Image().src = "/time_tracker?script_load=" + totalTime;
      </script>
      
      // Set up caching on media files for 1 month
      <FilesMatch "\.(gif|jpg|jpeg|png|swf|js|css)$">
          ExpiresDefault A2629744
          Header append Cache-Control "public, proxy-revalidate"
          Header append Vary "Accept-Encoding: *"
      </FilesMatch>
      
      // compresses all files for faster transfer
      LoadModule deflate_module modules/mod_deflate.so
      AddOutputFilterByType DEFLATE text/html text/plain text/xml font/opentype font/truetype font/woff
      <FilesMatch "\.(js|css|html|htm|php|xml)$">
         SetOutputFilter DEFLATE
      </FilesMatch>