精华帖 (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的冗余字节。 不知道有没有同样想法的兄弟叻。 |
|
返回顶楼 | |
发表时间: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)。 |
|
返回顶楼 | |
发表时间: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,主页加载模板都是异步加载,第一次加载只加载主页需要的组件就行了,怎么会慢呢? |
|
返回顶楼 | |
发表时间: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(); 原则上不增加额外的性能劣势为基本 |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间: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的紧密耦合的调用,从而增加代码的可读性和维护性。 |
|
返回顶楼 | |
发表时间: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端也可以做一些事情的。 |
|
返回顶楼 | |
发表时间: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,不需要同时载入,只在用户点击功能的时候载入就可以了! |
|
返回顶楼 | |
发表时间: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 }); } }); 这样来调用的 |
|
返回顶楼 | |
发表时间: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代码上的冗余。 |
|
返回顶楼 | |