提高程序运行速度 让Ext JS华而又实

来源:互联网 发布:网络推广与seo 编辑:程序博客网 时间:2024/05/22 01:52

Ext JS虽然有着华丽的界面,但是真正使用过的人才知道,它运行起来的速度是让人抓狂的,而导致速度慢的重要原因,就是JavaScript的加载,这里我们介绍几种方法,来提高Ext JS的运行速度,尽管不能完全解决,但对于程序还是很有帮助的。

AD: 2013云计算架构师峰会课程资料下载


    Ext JS虽然有着华丽的界面,但是真正使用过的人才知道,它运行起来的速度是让人抓狂的,而导致速度慢的重要原因,就是JavaScript的加载。Ext JS的全部JavaScript是比较大的,一个ext-all-debug.js就达2m多,它的压缩版也达600多k,这对于在网速不太快的时,下载JavaScript就得漫长的等待。

    51CTO推荐阅读:应用最广的十大Javascript框架

    其中日历任务控件,JavaScript多达四五个,每个JavaScript大小都达70多k,尽管我们采用了后加载的方式,则当用户点击我的任务功能时,才下载该JavaScript,但这样仍然很慢,因为下载的JavaScript很慢,鉴于此,在互联网上使用类似Joffice类似的程序,速度会使很多开发商不敢选用Ext JS作为开发技术。我们可以从以下几种方法来提高应用程序的运行速度:

    一.前期尽量少加载JavaScript

    这点在Joffice中有比较好的运用,采用的是由ScriptMgr.load方法来完成,加载完成后,其会在body中插入一个DIV,只要当前页面不被刷新,下次再访问该功能时,不需要再加载JavaScript。实例代码:

    1. view sourceprint?01 function $ImportJs(viewName,callback) {     
    2. var b = document.getElementById(viewName+'-hiden');       
    3.  
    4.  if (b != null) {       
    5.  
    6.       var view = eval('new ' + viewName + '()');       
    7.  
    8.      callback.call(this, view);       
    9.  
    10.  } else {       
    11.  
    12.       var jsArr = eval('App.importJs.' + viewName);       
    13.  
    14.      if(jsArr==undefined){       
    15.  
    16.           var view = eval('new ' + viewName + '()');       
    17.  
    18.           callback.call(this, view);       
    19.  
    20.          return ;       
    21.  
    22.      }       
    23.  
    24.       ScriptMgr.load({       
    25.  
    26.                   scripts : jsArr,       
    27.  
    28.                   callback : function() {       
    29.  
    30.                              
    31.  
    32.                      Ext.DomHelper.append(document.body,"<div id='"     
    33.  
    34.                                               + viewName       
    35.  
    36.                                               + "-hiden' style='display:none'></div>");       
    37.                       var view = eval('new ' + viewName + '()');       
    38.  
    39.                       callback.call(this, view);       
    40.  
    41.                   }       
    42.  
    43.       });       
    44.  
    45.  }  

    二.用Gzip进行JavaScript的超强压缩

    Gzip的官方网址

    http://www.gnu.org/software/gzip/

    Gzip的使用很简单

    解压至某个目录,会看到有一个Gzip.exe文件,然后在命令窗口进入该目录,执行:

    gzip ext-all.js

    ext-all.js马上变成为ext-all.js.gz。大小从原来600多k摇身一变成了160多k,简直压细小很多。这回下载速度就非常快了。那么浏览器能否解析这种压缩文件?答案是肯定的,前提是告诉浏览器,这种文件需要解压,然后再执行,解压的过程由浏览器来执行。那么应用程序如何告诉浏览器,该文件需要解压呢,这得由服务器通过Http的Header指令来进行。在JOffice中,就是通过Filter来进行的。

    1.把ext.all.js.gz文件名改为ext.all.gzjs,Filter等一下就会拦截这种文件的访问。

    2.写一个Filter,完成向Header添加指令。

    1. view sourceprint?01 package com.htsoft.core.web.filter;       
    2.  
    3.     import java.io.IOException;       
    4.  
    5.      import java.util.HashMap;       
    6.  
    7.      import java.util.Iterator;       
    8.  
    9.      import java.util.Map;       
    10.  
    11.      import javax.servlet.Filter;       
    12.  
    13.      import javax.servlet.FilterChain;       
    14.  
    15.     import javax.servlet.FilterConfig;       
    16.  
    17.      import javax.servlet.ServletException;    
    18.      
    19.      import javax.servlet.ServletRequest;       
    20.  
    21.      import javax.servlet.ServletResponse;       
    22.  
    23.      import javax.servlet.http.HttpServletRequest;       
    24.  
    25.      import javax.servlet.http.HttpServletResponse;       
    26.  
    27.              
    28.  
    29.      public class GzipJsFilter implements Filter {       
    30.  
    31.           Map headers = new HashMap();       
    32.  
    33.          public void destroy() {       
    34.  
    35.           }       
    36.  
    37.          public void doFilter(ServletRequest req, ServletResponse res,       
    38.  
    39.                  FilterChain chain) throws IOException, ServletException {       
    40.  
    41.              if(req instanceof HttpServletRequest) {       
    42.  
    43.                   doFilter((HttpServletRequest)req, (HttpServletResponse)res, chain);       
    44.  
    45.              }else {       
    46.  
    47.                   chain.doFilter(req, res);       
    48.  
    49.               }       
    50.  
    51.           }    
    52.      
    53.          public void doFilter(HttpServletRequest request,       
    54.  
    55.                   HttpServletResponse response, FilterChain chain)       
    56.  
    57.                  throws IOException, ServletException {       
    58.  
    59.                  request.setCharacterEncoding("UTF-8");       
    60.  
    61.                  for(Iterator it = headers.entrySet().iterator();it.hasNext();) {       
    62.  
    63.                       Map.Entry entry = (Map.Entry)it.next();       
    64.  
    65.                       response.addHeader((String)entry.getKey(),(String)entry.getValue());       
    66.  
    67.                   }       
    68.                  chain.doFilter(request, response);       
    69.  
    70.           }       
    71.  
    72.              
    73.  
    74.          public void init(FilterConfig config) throws ServletException {       
    75.  
    76.               String headersStr = config.getInitParameter("headers");       
    77.  
    78.               String[] headers = headersStr.split(",");       
    79.  
    80.              for(int i = 0; i < headers.length; i++) {       
    81.  
    82.                  String[] temp = headers[i].split("=");       
    83.  
    84.                  this.headers.put(temp[0].trim(), temp[1].trim());       
    85.  
    86.               }       
    87.  
    88.           }       
    89.      }   
    90.  
    91.       
    92. 3.在WEB.xml 文件中,添加以下配置:  
    93.  
    94. view sourceprint?01 <filter>         
    95.  
    96.       <filter-name>GzipJsFilter</filter-name>         
    97.  
    98.       <filter-class>com.htsoft.core.web.filter.GzipJsFilter</filter-class>         
    99.  
    100.       <init-param>         
    101.  
    102.           <param-name>headers</param-name>         
    103.  
    104.           <param-value>Content-Encoding=gzip</param-value>         
    105.  
    106.       </init-param>       
    107.  
    108. </filter>       
    109.  
    110. <filter-mapping>       
    111.  
    112. <filter-name>GzipJsFilter</filter-name>       
    113.  
    114. <url-pattern>*.gzjs</url-pattern>       
    115.  
    116. lt;/filter-mapping>       
    117.  
    118. <servlet-mapping>  

    4.在index.jsp中引入该压缩文件:

    1. <script type="text/javascript" src="<%=request.getContextPath()%>/ext3/ext-all.gzjs"></script> 
    2.  

    可以看到浏览器解压后,其代码是一样的:

    大家可以看到以上,这块是在外网使用的,其速度是比较快的。当然,浏览器解压这个文件需要一点时间,不过在本地解压是非常快的,可以不用管。虽说不能完全解决其速度问题,但是还是能有所帮助。

    0 0
    原创粉丝点击