提高EXT js的加载速度的方法

我们知道,EXT的全部js是比较大的,一个ext-all-debug.js就达2m多,它的压缩版(去掉js中的换行及空格),也达600多k,这对于在网速不太快的时,下载js就得漫长的等待。
JOffice中的日历任务控件,js多达四五个,每个js大小都达70多k,尽管我们采用了后加载的方式,则当用户点击我的任务功能时,才下载该js,但这样仍然很慢,因为下载的js很慢
,鉴于此,在互联网上使用类似Joffice类似的程序,速度会使很多开发商不敢选用ext作为开发技术。据本人当时参与移动一个内部采购平台的开发,就是因为其运行程序慢,遭到移动的终端用户的弃骂,
所以,要想用EXT来开发应用,需要解决其运行慢的特点。


我们可以从以下几种方法来提高应用程序的运行速度:

一.前期尽量少加载js. 

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

Java代码    收藏代码
  1.   function $ImportJs(viewName,callback) {  
  2. var b = document.getElementById(viewName+'-hiden');  
  3. if (b != null) {  
  4.     var view = eval('new ' + viewName + '()');  
  5.     callback.call(this, view);  
  6. else {  
  7.     var jsArr = eval('App.importJs.' + viewName);  
  8.     if(jsArr==undefined){  
  9.         var view = eval('new ' + viewName + '()');  
  10.         callback.call(this, view);  
  11.         return ;  
  12.     }  
  13.     ScriptMgr.load({  
  14.                 scripts : jsArr,  
  15.                 callback : function() {  
  16.                       
  17.                     Ext.DomHelper.append(document.body,"<div id='"  
  18.                                             + viewName  
  19.                                             + "-hiden' style='display:none'></div>");  
  20.                     var view = eval('new ' + viewName + '()');  
  21.                     callback.call(this, view);  
  22.                 }  
  23.     });  
  24. }  

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

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添加指令
   代码如下:

 

Java代码    收藏代码
  1. package com.htsoft.core.web.filter;  
  2.     import java.io.IOException;  
  3.     import java.util.HashMap;  
  4.     import java.util.Iterator;  
  5.     import java.util.Map;  
  6.     import javax.servlet.Filter;  
  7.     import javax.servlet.FilterChain;  
  8.     import javax.servlet.FilterConfig;  
  9.     import javax.servlet.ServletException;  
  10.     import javax.servlet.ServletRequest;  
  11.     import javax.servlet.ServletResponse;  
  12.     import javax.servlet.http.HttpServletRequest;  
  13.     import javax.servlet.http.HttpServletResponse;  
  14.       
  15.     public class GzipJsFilter implements Filter {  
  16.         Map headers = new HashMap();  
  17.         public void destroy() {  
  18.         }  
  19.         public void doFilter(ServletRequest req, ServletResponse res,  
  20.                 FilterChain chain) throws IOException, ServletException {  
  21.             if(req instanceof HttpServletRequest) {  
  22.                 doFilter((HttpServletRequest)req, (HttpServletResponse)res, chain);  
  23.             }else {  
  24.                 chain.doFilter(req, res);  
  25.             }  
  26.         }  
  27.         public void doFilter(HttpServletRequest request,  
  28.                 HttpServletResponse response, FilterChain chain)  
  29.                 throws IOException, ServletException {  
  30.                 request.setCharacterEncoding("UTF-8");  
  31.                 for(Iterator it = headers.entrySet().iterator();it.hasNext();) {  
  32.                     Map.Entry entry = (Map.Entry)it.next();  
  33.                     response.addHeader((String)entry.getKey(),(String)entry.getValue());  
  34.                 }  
  35.                 chain.doFilter(request, response);  
  36.         }  
  37.       
  38.         public void init(FilterConfig config) throws ServletException {  
  39.             String headersStr = config.getInitParameter("headers");  
  40.             String[] headers = headersStr.split(",");  
  41.             for(int i = ; i < headers.length; i++) {  
  42.                 String[] temp = headers[i].split("=");  
  43.                 this.headers.put(temp[].trim(), temp[1].trim());  
  44.             }  
  45.         }  
  46.     }  
 

    
3.在WEB.xml 文件中,添加以下配置:

Java代码    收藏代码
  1.  <filter>    
  2.     <filter-name>GzipJsFilter</filter-name>    
  3.     <filter-class>com.htsoft.core.web.filter.GzipJsFilter</filter-class>    
  4.     <init-param>    
  5.         <param-name>headers</param-name>    
  6.         <param-value>Content-Encoding=gzip</param-value>    
  7.     </init-param>  
  8. </filter>  
  9. <filter-mapping>  
  10. <filter-name>GzipJsFilter</filter-name>  
  11. <url-pattern>*.gzjs</url-pattern>  
  12. lt;/filter-mapping>  
  13. <servlet-mapping>  
 

  
4.在index.jsp中引入该压缩文件:
  <script type="text/javascript" src="<%=request.getContextPath()%>/ext3/ext-all.gzjs"></script>
  

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

 

 

大家可以看到以上,这块是在外网使用的,其速度是比较快的。当然,浏览器解压这个文件需要一点时间,不过在本地解压是非常快的,可以不用管。

 

 

三、通过Js缓存,更加可以提高EXT的加载速度,关于缓存,本文不作讨论。

 

转载于:https://my.oschina.net/cmw/blog/29579

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值