提升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,只要當前頁面不被刷新,下次再訪問該功能時,不須要再加載jsjavascript

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

 

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 文件中,添加如下配置:web

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>
  瀏覽器

能夠看到瀏覽器解壓後,其代碼是同樣的:緩存

 

 

你們能夠看到以上,這塊是在外網使用的,其速度是比較快的。固然,瀏覽器解壓這個文件須要一點時間,不過在本地解壓是很是快的,能夠不用管。服務器

 

 

3、經過Js緩存,更加能夠提升EXT的加載速度,關於緩存,本文不做討論。app

相關文章
相關標籤/搜索