论坛首页 Web前端技术论坛

也来秀秀,我的Ext学习成果

浏览 33551 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-20  
lqql 写道
EXT加载慢,我好像没有觉悟得啊,EXT也就库文件大了点啊,用OAP,按需加载块就行了啊,真是奇怪,用EXT加应用系统不慢啊!


Ext关于加载就做的没有Dojo强叻,Dojo一个Require就可以按需的把所需要的模块就加进来,还会检查依赖性,但是我花叻几个小时翻Ext的文档,也没有找到相关的说明。不过后来把这个问题还是先过掉叻,还是先搞定基础问题先,而且在我现在的写sample的过程中,也发现自己加上的js的文件也慢慢的庞大起来叻,所以Ext的加载确实是个问题。

不过我想的话,到时候能不能有一个Dynamic Component的机制,这个Dynamic Componnet就是动态的更加服务器端的信息来生成Componnet,这样就可以去掉好多js的冗余字节。

不知道有没有同样想法的兄弟叻。
0 请登录后投票
   发表时间:2008-06-20  
结合这Dwr和Json-RPC,我自己的Json-RPC框架的考虑。

这样后台提供一个简单的普通的method接口调用,UI层的Json对象的封装和server的Json对象的解析,已经Json对象到Class的mapping都在enginee里进行叻处理。这样对于server的method关心的仅是自己的input,实现和output。前端也结合后台的method的input,output来启动自己的调用和调用后的自己的逻辑就可以叻。从而实现前台和后台的分离,把主要的经历个放在各自的业务逻辑(server端-Java Class)和view的显示逻辑(client-Ext)。
  • 大小: 119.4 KB
0 请登录后投票
   发表时间:2008-06-20  
tubinee 写道
lqql 写道
EXT加载慢,我好像没有觉悟得啊,EXT也就库文件大了点啊,用OAP,按需加载块就行了啊,真是奇怪,用EXT加应用系统不慢啊!


Ext关于加载就做的没有Dojo强叻,Dojo一个Require就可以按需的把所需要的模块就加进来,还会检查依赖性,但是我花叻几个小时翻Ext的文档,也没有找到相关的说明。不过后来把这个问题还是先过掉叻,还是先搞定基础问题先,而且在我现在的写sample的过程中,也发现自己加上的js的文件也慢慢的庞大起来叻,所以Ext的加载确实是个问题。

不过我想的话,到时候能不能有一个Dynamic Component的机制,这个Dynamic Componnet就是动态的更加服务器端的信息来生成Componnet,这样就可以去掉好多js的冗余字节。

不知道有没有同样想法的兄弟叻。

不明白你的意思,你说的这个模块动态加载是指什么意思?
我的说动态加载是指功能模块都是和index.js分开的,即每个模块都是自己的JS,主页加载模板都是异步加载,第一次加载只加载主页需要的组件就行了,怎么会慢呢?
0 请登录后投票
   发表时间:2008-06-20  
tubinee 写道
结合这Dwr和Json-RPC,我自己的Json-RPC框架的考虑。

这样后台提供一个简单的普通的method接口调用,UI层的Json对象的封装和server的Json对象的解析,已经Json对象到Class的mapping都在enginee里进行叻处理。这样对于server的method关心的仅是自己的input,实现和output。前端也结合后台的method的input,output来启动自己的调用和调用后的自己的逻辑就可以叻。从而实现前台和后台的分离,把主要的经历个放在各自的业务逻辑(server端-Java Class)和view的显示逻辑(client-Ext)。

我也不用DWR,JSON-PRC,这些只会增加性能负担,
当然为了结构清晰,我也通过调用一个统一个的servlet,运用反射来远程调用JAVA方法如:
proxy : new Ext.data.HttpProxy({
		url : '../remoteAction?method=File.listFile',
		method : 'GET'
	})

mehod=File.listFile这个参数变是来调用远程以的方法,这种通过URL来调用,即直观又易于调试,因为通过连接就可以直接访问你传递来的JSON,也不会在客户端生成额外代码
而JSON生成方面,封装了一些EXT JSON的简单生成方法,如:
JsonArray array = new JsonArray();
		if (files!= null) {
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					String filepath = files[i].getPath()
							.replaceAll("\\\\", "/").replace(root + dir, "");
					Json json = new Json();
					json.additem("text", files[i].getName());
					json.additem("id", filepath);
					array.add(json);
				}
			}
		}
		return array.getString();

原则上不增加额外的性能劣势为基本
0 请登录后投票
   发表时间:2008-06-20  
lqql 写道
tubinee 写道
结合这Dwr和Json-RPC,我自己的Json-RPC框架的考虑。

这样后台提供一个简单的普通的method接口调用,UI层的Json对象的封装和server的Json对象的解析,已经Json对象到Class的mapping都在enginee里进行叻处理。这样对于server的method关心的仅是自己的input,实现和output。前端也结合后台的method的input,output来启动自己的调用和调用后的自己的逻辑就可以叻。从而实现前台和后台的分离,把主要的经历个放在各自的业务逻辑(server端-Java Class)和view的显示逻辑(client-Ext)。

我也不用DWR,JSON-PRC,这些只会增加性能负担,
当然为了结构清晰,我也通过调用一个统一个的servlet,运用反射来远程调用JAVA方法如:
proxy : new Ext.data.HttpProxy({
		url : '../remoteAction?method=File.listFile',
		method : 'GET'
	})

mehod=File.listFile这个参数变是来调用远程以的方法,这种通过URL来调用,即直观又易于调试,因为通过连接就可以直接访问你传递来的JSON,也不会在客户端生成额外代码
而JSON生成方面,封装了一些EXT JSON的简单生成方法,如:
JsonArray array = new JsonArray();
		if (files!= null) {
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					String filepath = files[i].getPath()
							.replaceAll("\\\\", "/").replace(root + dir, "");
					Json json = new Json();
					json.additem("text", files[i].getName());
					json.additem("id", filepath);
					array.add(json);
				}
			}
		}
		return array.getString();

原则上不增加额外的性能劣势为基本



兄弟,这里咱们想到一块去叻
servlet端是做Json的encode和decode的enginee,每个method仅负责自己的逻辑。在Js端不负责太多的转换,只是做Json的decode获取对象,从而能稍微减轻一下client的成本

//这里是forumlist的 store的代码,url是../ajxrpc/ebxboard.getforums;
var store = new Ext.data.Store({
			    	/**
			    	proxy: new Ext.data.MemoryProxy(myData),
			    	**/
			    	
			    	/**
			    	proxy: new Ext.data.ScriptTagProxy({
			            url: './pageinfo.jsp'
			        }),
			        **/
			        
			        proxy: new Ext.data.HttpProxy({
			            url: '../ajxrpc/ebxboard.getforums'
			        }),
			        


//这里是server端的代码,接口仅仅关注自己的逻辑,client的参数和返回object到Json的转换,以及前台到Server的json对象的转换,都在AjxRPCEnginee处理叻,后台开发人员可以在这里从容的实现自己的逻辑,而不需要像struts1.X里那样基于request的编程。
public ExtPageList<ForumMode> getForumModes(String rootId)
	    throws ObjectNotExistException
	{
		if(StringUtils.isBlank(rootId))
			rootId = "-1";
		
	    Forum forums[] = ado.getForum(null, null, rootId);
	    
	    if(forums == null)
	        return new ExtPageList<ForumMode>();
	    else
	    {
	    	ExtPageList rtn = new ExtPageList<ForumMode>();
	    	
	    	int ind = 0;
	    	for(Forum forum: forums)
	    	{
	    		ForumMode f = new ForumMode();
	    		f.setCreatedate(I18nUtil.getDateTimeString(forum.getCreationDate()));
	    		f.setTitle(forum.getName().toString());
	    		f.setDescription(forum.getDescription().toString());
	    		f.setId(forum.getId());
	    		rtn.add(f);
	    		
	    		ind ++;
	    	}
	    	
	        return rtn;	       
	    }
	}

0 请登录后投票
   发表时间:2008-06-20  
lqql 写道
tubinee 写道
结合这Dwr和Json-RPC,我自己的Json-RPC框架的考虑。

这样后台提供一个简单的普通的method接口调用,UI层的Json对象的封装和server的Json对象的解析,已经Json对象到Class的mapping都在enginee里进行叻处理。这样对于server的method关心的仅是自己的input,实现和output。前端也结合后台的method的input,output来启动自己的调用和调用后的自己的逻辑就可以叻。从而实现前台和后台的分离,把主要的经历个放在各自的业务逻辑(server端-Java Class)和view的显示逻辑(client-Ext)。

我也不用DWR,JSON-PRC,这些只会增加性能负担,
当然为了结构清晰,我也通过调用一个统一个的servlet,运用反射来远程调用JAVA方法如:
proxy : new Ext.data.HttpProxy({
		url : '../remoteAction?method=File.listFile',
		method : 'GET'
	})

mehod=File.listFile这个参数变是来调用远程以的方法,这种通过URL来调用,即直观又易于调试,因为通过连接就可以直接访问你传递来的JSON,也不会在客户端生成额外代码
而JSON生成方面,封装了一些EXT JSON的简单生成方法,如:
JsonArray array = new JsonArray();
		if (files!= null) {
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					String filepath = files[i].getPath()
							.replaceAll("\\\\", "/").replace(root + dir, "");
					Json json = new Json();
					json.additem("text", files[i].getName());
					json.additem("id", filepath);
					array.add(json);
				}
			}
		}
		return array.getString();

原则上不增加额外的性能劣势为基本


为了仅可能的减低client的负载,没有对rpc的输入做转换,还是很随意的,不过在server端做叻处理,把输入的param会转成Json,然后在转换成method里面的Object。然后返回给客户端的做Json.decode可以拿到和server端一样的object结构,这样两边就可以针对接口编程叻,不过这里有点不好,由于这里的实现不像DWR做的是接口紧耦合的调用,所以还是有他的弱点,比如规范性,维护性,虽然DWR和Json-RPC也做不到compile的checking,但是他们的interface都是根据服务器在client定义的stub里,所以这样一定比我这样松耦合的调用要在checking上有优势的多。这一点Json-RPC也望尘莫及呀。

这个问题也是我一直思考的问题,如何在架构里实现类似DWR的紧密耦合的调用,从而增加代码的可读性和维护性。
0 请登录后投票
   发表时间:2008-06-20  
lqql 写道
不明白你的意思,你说的这个模块动态加载是指什么意思?
我的说动态加载是指功能模块都是和index.js分开的,即每个模块都是自己的JS,主页加载模板都是异步加载,第一次加载只加载主页需要的组件就行了,怎么会慢呢?


刚刚看到,我指的动态加载是Dojo里的一个特性,Dojo里可以在需要用的某个js的时候去require依赖的模块,在index.html里加载自己所需要的js。然后需要那个模块就在那个页面里去require一下。这样就可以自动的把仅仅需要的载下来。这是我说的动态载入的意思,

然后还有一个background延迟下载的概念,我们在项目实施过程中,由于require确实是太多js叻,这样到主功能用的时候,载入第一下的时候太慢,用户比较反感,不管你如何解释,说仅仅一次就好叻,也不行,就用叻这个策略,其实很简单的,在登录页面下载有关的页面同时,在client背后偷偷的载入一些后面需要用到的js文件,由于login这里客户输入是时间还是有比较充分的空隙,异步把后面的一些js载下来,在这里用户还没有多大的察觉,客户也可以接受叻

但是我觉得这不是解决的最终方法,现在载的慢(主要指single-page application)是所有的js文件太多叻,一个个的component就是js代码,处理事件的也是js代码,在用Ext的过程中,考虑可以在Ext基础上做个Container Manager, Component Manager,这两个Manager主要是动态去构造我们的compoentn,component的信息来自于server的config file,我以前的server端程序也做过这样的工作的。不过不知道这个在Ext里能不能想清楚,做出这样的东西,如果有这样的东西,那么大部分的componet或者container都可以通过 这个去产生叻,及可以提高对内存,DOM数的统一管理,又可以减少描述componet的代码。 还可以进一步对Ext Event的机制进行抽象看能不能server端也可以做一些事情的。
0 请登录后投票
   发表时间:2008-06-20  
tubinee 写道
lqql 写道
不明白你的意思,你说的这个模块动态加载是指什么意思?
我的说动态加载是指功能模块都是和index.js分开的,即每个模块都是自己的JS,主页加载模板都是异步加载,第一次加载只加载主页需要的组件就行了,怎么会慢呢?


刚刚看到,我指的动态加载是Dojo里的一个特性,Dojo里可以在需要用的某个js的时候去require依赖的模块,在index.html里加载自己所需要的js。然后需要那个模块就在那个页面里去require一下。这样就可以自动的把仅仅需要的载下来。这是我说的动态载入的意思,

然后还有一个background延迟下载的概念,我们在项目实施过程中,由于require确实是太多js叻,这样到主功能用的时候,载入第一下的时候太慢,用户比较反感,不管你如何解释,说仅仅一次就好叻,也不行,就用叻这个策略,其实很简单的,在登录页面下载有关的页面同时,在client背后偷偷的载入一些后面需要用到的js文件,由于login这里客户输入是时间还是有比较充分的空隙,异步把后面的一些js载下来,在这里用户还没有多大的察觉,客户也可以接受叻

但是我觉得这不是解决的最终方法,现在载的慢(主要指single-page application)是所有的js文件太多叻,一个个的component就是js代码,处理事件的也是js代码,在用Ext的过程中,考虑可以在Ext基础上做个Container Manager, Component Manager,这两个Manager主要是动态去构造我们的compoentn,component的信息来自于server的config file,我以前的server端程序也做过这样的工作的。不过不知道这个在Ext里能不能想清楚,做出这样的东西,如果有这样的东西,那么大部分的componet或者container都可以通过 这个去产生叻,及可以提高对内存,DOM数的统一管理,又可以减少描述componet的代码。 还可以进一步对Ext Event的机制进行抽象看能不能server端也可以做一些事情的。

为什么要进入主页的时候要载入各个模块的JS?完全可以不载入啊!我做的也是(single-page application),但各个模块都是独立的JS,不需要同时载入,只在用户点击功能的时候载入就可以了!
0 请登录后投票
   发表时间:2008-06-20  
我的模块都是通过
						Ext.Ajax.request({
							method : 'GET',
							url : node.attributes.path,
							scope : this,
							success : function(response) {
								eval(response.responseText);
								loadMask.hide();
							},
							failure : function() {
								loadMask.hide();
								Ext.MessageBox.show({
									title : '系统错误',
									msg : node.text + '模块路径错误!',
									buttons : Ext.MessageBox.OK,
									icon : Ext.MessageBox.ERROR
								});
								
							}
						});

这样来调用的
0 请登录后投票
   发表时间:2008-06-20  
lqql 写道
我的模块都是通过
						Ext.Ajax.request({
							method : 'GET',
							url : node.attributes.path,
							scope : this,
							success : function(response) {
								eval(response.responseText);
								loadMask.hide();
							},
							failure : function() {
								loadMask.hide();
								Ext.MessageBox.show({
									title : '系统错误',
									msg : node.text + '模块路径错误!',
									buttons : Ext.MessageBox.OK,
									icon : Ext.MessageBox.ERROR
								});
								
							}
						});

这样来调用的



是的,我想Dojo的require估计也是这样来做的

这是我说的第一种方式,用的时候去动态的require叻,类似于服务器端的lazy loading的机制,不过不同的方法可能需要不同的处理,比如,我们以前也是用lazy loading的,既然是lazy,那是说在用的时候,那是减少叻boot时的时间,但是增加叻初次调用的时间,所以我们在处理的时候,现在是两个方法结合着用,对用户要求比较高的时候,采用boot加异步延迟下载,对用户要求不是很高,或者性能比较好的地方采用 lazy loading

但是我觉得这两个方法还是没有从根本去解决问题。何为根本,我们用的Js,js就是根本,Js文件太多,Js文件太臃肿,所以根本就是给js减肥,给js减肥物理上方法做compress做Gzip传输,还有就是从我们的架构上去优化和抽象通用机制,减少js代码上的冗余。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics