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

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

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.  }  

 

#p#

二.用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.  

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

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

原文地址:http://www.cnblogs.com/single1970/archive/2010/08/19/Extjs.html

【编辑推荐】

  1. 移花接木 实例讲解Ext JS控件的扩展
  2. Ext JS + jQTouch + Raphael = Sencha
  3. 应用最广的十大Javascript框架
  4. JavaScript框架的选择标准
责任编辑:王晓东 来源: 博客园
相关推荐

2018-09-19 15:46:51

编程语言Python编译器

2018-03-09 10:15:00

Linux应用程序运行速度

2020-04-30 21:25:33

Python 函数程序员

2018-08-02 16:17:34

Python 开发编程语言

2019-09-23 14:01:57

iPhoneA13测试

2009-08-11 09:10:26

Windows 7系统提速

2015-11-16 11:53:06

程序员效率加班

2012-10-24 09:40:46

网络优化系统优化

2020-12-15 06:44:14

程序运行速度

2009-02-25 08:47:42

MacSafari4

2023-11-20 09:57:03

内联函数C++

2024-04-29 08:16:18

2021-03-07 22:12:04

Windows 10Windows微软

2010-05-10 13:21:16

Windows 7系统日志

2009-06-18 12:21:07

javascriptdom

2018-06-27 09:00:00

Linux运行速度CPU信息

2016-02-22 09:27:18

2024-09-27 08:35:33

数组JavaScript性能

2011-01-12 11:22:24

微软认证

2010-04-12 10:01:43

Windows 7运行速度
点赞
收藏

51CTO技术栈公众号