宏天对EXTJS的性能调整:
1.打开Tomcat或Appace的js、html,xml的gzip压缩功能
2.同时用yui工具压缩所有的开发的js,css
3.配置image,js,css的缓存功能
4.用gzip工具压缩超大的js
5、EXTJS按模板下载js
最近有不少用户跟我反馈,访问Joffice页面的某些功能,需要等几秒钟才能出来。鉴于这种情况,在此分析一下原因,同时也给出一些解决方案,可以帮助Joffice 1.2,Joffice 1.3的开发用户解决这种根本的问题,可以让这种按模块下载js速度提高7-8倍,特别是有一些模块需要加载很多js的时候,其下载速度还高更多。
joffice 1.3以前的版本,按模块下载的原理如下:
在此我们以流程管理模块为例:
在App.import.js中定义该模块所依赖的js,如下:
- FlowManagerView:[
- __ctxPath+'/js/flow/ProTypeForm.js',
- __ctxPath+'/js/flow/ProDefinitionForm.js',
- __ctxPath+'/js/flow/ProDefinitionView.js',
- __ctxPath+'/js/flow/FlowManagerView.js',
- __ctxPath+'/js/flow/ProDefinitionDetail.js',
- __ctxPath+'/js/flow/ProcessRunStart.js',
- __ctxPath+'/js/flow/ProDefinitionSetting.js',
- __ctxPath+'/js/flow/MyTaskView.js',
- __ctxPath+'/js/flow/ProcessNextForm.js',
- __ctxPath+'/js/flow/FormDesignWindow.js',
- __ctxPath+'/js/flow/FormEditorWindow.js',
- __ctxPath+'/js/flowDesign/FlowDesignerWindow.js'
- ]
FlowManagerView:[ __ctxPath+'/js/flow/ProTypeForm.js', __ctxPath+'/js/flow/ProDefinitionForm.js', __ctxPath+'/js/flow/ProDefinitionView.js', __ctxPath+'/js/flow/FlowManagerView.js', __ctxPath+'/js/flow/ProDefinitionDetail.js', __ctxPath+'/js/flow/ProcessRunStart.js', __ctxPath+'/js/flow/ProDefinitionSetting.js', __ctxPath+'/js/flow/MyTaskView.js', __ctxPath+'/js/flow/ProcessNextForm.js', __ctxPath+'/js/flow/FormDesignWindow.js', __ctxPath+'/js/flow/FormEditorWindow.js', __ctxPath+'/js/flowDesign/FlowDesignerWindow.js' ]
在此可以看出,该模块所依赖的js比较多,不过每个js都不大。
当点击左菜单的“流程管理”时,其就通过ScriptMgr来下载其所依赖的js,全部下载完成后,才创建这个流程管理的Panel,并且加到TabCenterPanel中去。
我们的调用下载的js代码如下:
- function $ImportJs(viewName,callback,params) {
- var b = jsCache[viewName];
- if (b != null) {
- var view =newView(viewName,params);
- callback.call(this, view);
- } else {
- var jsArr = eval('App.importJs.' + viewName);
- if(jsArr==undefined || jsArr.length==0){
- try{
- var view = newView(viewName,params);
- callback.call(this, view);
- }catch(e){
- }
- return ;
- }
- ScriptMgr.load({
- scripts : jsArr,
- callback : function() {
- jsCache[viewName]=0;
- var view = newView(viewName,params);
- callback.call(this, view);
- }
- });
- }
- }
function $ImportJs(viewName,callback,params) { var b = jsCache[viewName]; if (b != null) { var view =newView(viewName,params); callback.call(this, view); } else { var jsArr = eval('App.importJs.' + viewName); if(jsArr==undefined || jsArr.length==0){ try{ var view = newView(viewName,params); callback.call(this, view); }catch(e){ } return ; } ScriptMgr.load({ scripts : jsArr, callback : function() { jsCache[viewName]=0; var view = newView(viewName,params); callback.call(this, view); } }); } }
即我们调用:
$ImportJs('FlowManagerView',function(){ return new FlowManagerView(); });
当传入FlowManagerView时,告诉我们就是需要在App.Import.js中取出该依赖的js数组,然后传给ScriptMgr的load中的scripts参数,告诉他们我们要完成这些js的加载,并且完成后,创建FlowManagerView对象。
现在我们来看一下ScriptMgr的Load方法:
- ScriptLoaderMgr = function() {
- this.loader = new ScriptLoader();
- this.load = function(o) {
- if (!Ext.isArray(o.scripts)) {
- o.scripts = [o.scripts];
- }
- o.url = o.scripts.shift();
- if (o.scripts.length == 0) {
- this.loader.load(o);
- } else {
- o.scope = this;
- this.loader.load(o, function() {
- this.load(o);
- });
- }
- };
- };
ScriptLoaderMgr = function() { this.loader = new ScriptLoader(); this.load = function(o) { if (!Ext.isArray(o.scripts)) { o.scripts = [o.scripts]; } o.url = o.scripts.shift(); if (o.scripts.length == 0) { this.loader.load(o); } else { o.scope = this; this.loader.load(o, function() { this.load(o); }); } }; };
ScriptLoader的代码如下:
- /**
- * 用于动态加载js
- * sample is here
- * ScriptMgr.load({
- * scripts: ['/js/other-prerequisite.js', '/js/other.js'],
- * callback: function() {
- * var other = new OtherObject();
- * alert(other); //just loaded
- * }
- * });
- */
- ScriptLoader = function() {
- this.timeout = 10;
- this.scripts = [];
- this.disableCaching = true;//false
- this.loadMask = null;
- };
- ScriptLoader.prototype = {
- showMask : function() {
- if (!this.loadMask) {
- this.loadMask = new Ext.LoadMask(Ext.getBody());
- this.loadMask.show();
- }
- },
- hideMask : function() {
- if (this.loadMask) {
- this.loadMask.hide();
- this.loadMask = null;
- }
- },
- processSuccess : function(response) {
- this.scripts[response.argument.url] = true;
- window.execScript ? window.execScript(response.responseText) : window
- .eval(response.responseText);
- //if (response.argument.options.scripts.length == 0) {
- this.hideMask();
- //}
- if (typeof response.argument.callback == 'function') {
- response.argument.callback.call(response.argument.scope);
- }
- },
- processFailure : function(response) {
- this.hideMask();
- Ext.MessageBox.show({
- title : '应用程序出错',
- msg : 'Js脚本库加载出错,服务器可能停止,请联系管理员。',
- closable : false,
- icon : Ext.MessageBox.ERROR,
- minWidth : 200
- });
- setTimeout(function() {Ext.MessageBox.hide();}, 3000);
- },
- load : function(url, callback) {
- var cfg, callerScope;
- if (typeof url == 'object') { // must be config object
- cfg = url;
- url = cfg.url;
- callback = callback || cfg.callback;
- callerScope = cfg.scope;
- if (typeof cfg.timeout != 'undefined') {
- this.timeout = cfg.timeout;
- }
- if (typeof cfg.disableCaching != 'undefined') {
- this.disableCaching = cfg.disableCaching;
- }
- }
- if (this.scripts[url]) {
- if (typeof callback == 'function') {
- callback.call(callerScope || window);
- }
- return null;
- }
- this.showMask();
- //alert('load now?');
- Ext.Ajax.request({
- url : url,
- success : this.processSuccess,
- failure : this.processFailure,
- scope : this,
- timeout : (this.timeout * 1000),
- disableCaching : this.disableCaching,
- argument : {
- 'url' : url,
- 'scope' : callerScope || window,
- 'callback' : callback,
- 'options' : cfg
- }
- });
- }
- };
/** * 用于动态加载js * sample is here * ScriptMgr.load({ * scripts: ['/js/other-prerequisite.js', '/js/other.js'], * callback: function() { * var other = new OtherObject(); * alert(other); //just loaded * } * }); */ ScriptLoader = function() { this.timeout = 10; this.scripts = []; this.disableCaching = true;//false this.loadMask = null; }; ScriptLoader.prototype = { showMask : function() { if (!this.loadMask) { this.loadMask = new Ext.LoadMask(Ext.getBody()); this.loadMask.show(); } }, hideMask : function() { if (this.loadMask) { this.loadMask.hide(); this.loadMask = null; } }, processSuccess : function(response) { this.scripts[response.argument.url] = true; window.execScript ? window.execScript(response.responseText) : window .eval(response.responseText); //if (response.argument.options.scripts.length == 0) { this.hideMask(); //} if (typeof response.argument.callback == 'function') { response.argument.callback.call(response.argument.scope); } }, processFailure : function(response) { this.hideMask(); Ext.MessageBox.show({ title : '应用程序出错', msg : 'Js脚本库加载出错,服务器可能停止,请联系管理员。', closable : false, icon : Ext.MessageBox.ERROR, minWidth : 200 }); setTimeout(function() {Ext.MessageBox.hide();}, 3000); }, load : function(url, callback) { var cfg, callerScope; if (typeof url == 'object') { // must be config object cfg = url; url = cfg.url; callback = callback || cfg.callback; callerScope = cfg.scope; if (typeof cfg.timeout != 'undefined') { this.timeout = cfg.timeout; } if (typeof cfg.disableCaching != 'undefined') { this.disableCaching = cfg.disableCaching; } } if (this.scripts[url]) { if (typeof callback == 'function') { callback.call(callerScope || window); } return null; } this.showMask(); //alert('load now?'); Ext.Ajax.request({ url : url, success : this.processSuccess, failure : this.processFailure, scope : this, timeout : (this.timeout * 1000), disableCaching : this.disableCaching, argument : { 'url' : url, 'scope' : callerScope || window, 'callback' : callback, 'options' : cfg } }); } };
从以上我们可以看出,其加载的js数组的时候,是加载完成一个js后,然后再加载另一个js,直到加载完成后才调用回调函数。若一个模块有20个js,每个js平均下载的时间需要0.5秒,即就需要10秒钟加载。当然我们可以把这些js合并至一个js,然后下载,这是理论上是可以的,不过不利于代码的划分。
我们知道浏览器是可以同时下载这些js的,只不过我们需要知道什么时候下载完成,下载完成后我们就可以调用回调函数。
鉴于此, 我们通过一个变量来记录其下载js,每完成下载一个就自动加1,若下载完成后,下载的数量就跟我们依赖的js的数量一样,就可以回调,这样我们有多少个js,就产生多少个下载器,每个下载器同时下载这些js,改进后的ScriptMgr的代码如下所示:
- ScriptLoaderMgr = function() {
- this.loader = new ScriptLoader();
- this.load = function(o) {
- if (!Ext.isArray(o.scripts)) {
- o.scripts = [o.scripts];
- }
- //记数器
- o.lfiles=0;
- for(var i=0;i<o.scripts.length;i++){
- o.url = o.scripts[i];
- o.scope = this;
- this.loader.load(o, function() {
- o.lfiles++;
- if(o.lfiles==o.scripts.length){
- if(o.callback!=null){
- this.loader.hideMask();
- o.callback.call(this);
- }
- }
- });
- }
- };
- };
ScriptLoaderMgr = function() { this.loader = new ScriptLoader(); this.load = function(o) { if (!Ext.isArray(o.scripts)) { o.scripts = [o.scripts]; } //记数器 o.lfiles=0; for(var i=0;i<o.scripts.length;i++){ o.url = o.scripts[i]; o.scope = this; this.loader.load(o, function() { o.lfiles++; if(o.lfiles==o.scripts.length){ if(o.callback!=null){ this.loader.hideMask(); o.callback.call(this); } } }); } }; };
发表评论
-
前后端分离+微服务架构的BPM快速开发平台
2019-10-30 19:04 6581 概述 EIP(Enterprise Inf ... -
基于开源流程引擎Activiti5的工作流开发平台 BPMX3
2012-07-26 14:35 4179BPMX3平台是宏天软件在ESTBPM2的基础上,追随开源工作 ... -
Activiti 工作流会签开发设计思路
2012-07-26 14:32 3299Activiti 工作流会签开发设计思路 在流程业务管 ... -
基于开源流程引擎Activiti5的工作流开发平台BPM X3
2012-06-11 09:17 13BPMX3平台是宏天软件在ESTBPM2的基础上,追随开源工作 ... -
J.Office中的公文签名及签章
2011-08-12 13:58 1716政府的很多系统都有涉及到电子签名及签章的管理功能,在jof ... -
JOffice2中WebService的使用(CXF)
2011-08-12 13:54 15641. WebService基本概念 WSDL: ... -
JOffice2 发布了开源的开发者体验版本
2011-08-12 13:48 1118JOffice的爱好者有福音了,经公司决定,现在 ... -
代码生成器EST-BPM
2011-05-30 14:30 1771一、代码加速器的介绍 代码加速器是基于Velo ... -
选用ibatis和hibernate的区别
2011-05-05 09:22 814选用ibatis和hibernate的区别 http://w ... -
JOffice2升级智能化表单设计及可视化流程设计(JBPM4.4) 100%开放源代码
2011-03-23 15:54 1003JOffice2升级智能化表单 ...
相关推荐
5、在控件中加载“采集测试文件”中的全部文件,或设置扫描仪后扫描,即可开始宏天影像采集前端的体验。 【有效期】 本次演示系统有效期到2013年9月29日,过期后将无法使用条码识别、影像编辑等部分功能,如需...
宏天J.Office协同办公系统V1.3是一款全面覆盖企业日常办公需求的软件,它包含了丰富的功能模块,旨在提升工作效率和团队协作能力。以下是对各主要功能的详细说明: 1. **我的桌面**:这是个人工作台,用户可以按照...
- 发布了Est-BPM v2.0、J-Office OA v2.0、J-Office ENT v1.3和CMS 1.0等多个版本的产品。 - 随后发布了BPMX 3,采用了Activiti开源流程引擎,支持BPMN2标准,可以独立或嵌入部署。 - 进一步推出了BPMX 5,对原有...
- **Office相关配置**:印章管理、Office模板管理等。 - **代码生成器**:自动化生成代码模板,提高开发效率。 #### 四、总结 宏天BPMX3.3业务流程管理平台是一款强大的企业级解决方案,通过其丰富的功能模块和...
### 宏天软件J2EE应用快速开发平台技术解析 #### EST-BPM平台:革新企业应用开发 **一、EST-BPM平台概述** 广州宏天软件有限公司,作为国内政府协同办公应用解决方案的领军者,专注于JBPM工作流引擎的开发与应用...
【标题】:“宏天信业:2021年半年度报告” 【描述】:这份压缩包文件包含的是宏天信业公司在2021年的半年度报告,它提供了该公司在2021年上半年的运营状况、财务表现、业务发展以及市场策略等关键信息。 【标签】...
宏天信业:2021年半年度报告.PDF
宏天信业:2019年半年度报告.PDF
- **后续发展**:随着技术的不断进步,宏天还规划并开发了J.Office 3.0,并持续对BPMX3进行版本修正和升级,以适应更多应用场景的需求。 #### 三、宏天公司简介 宏天是一家国内领先的政府协同办公OA应用平台解决...
3. **基于模板代码生成**:支持基于模板的代码生成,提高了开发效率,减少了重复劳动。 4. **丰富的报表展示**:支持FineReport及Jasper Report两种报表引擎,满足多样化数据呈现需求。 5. **跨数据库的数据访问支持...
4. **性能优化**:jBPM的高性能引擎可以处理大量并发的流程实例。 总结来说,jBPM是一个强大且灵活的工作流解决方案,尤其适合那些需要频繁调整业务流程的企业。通过学习和掌握jBPM,开发者能够更有效地构建和管理...
同时保证系统的稳定性,通过合理的架构设计和性能优化措施。 #### 五、实现细节 1. **工作流集成**:将JBPM工作流引擎集成到CRM系统中,实现业务流程的自动化执行。 2. **界面设计**:采用响应式设计原则,确保...
黎剑发在实习期间参与了多个项目,包括DSM南方电网自动计量系统、FOS松下财务优化系统、DRP东菱电器项目和威创工程服务平台二期,以及在宏天软件的广州东方信贸易有限公司企业综合管理系统。他在这些项目中担任了...
网上商城项目通常指的是一个电子商务平台,允许用户浏览商品、添加商品到购物车、进行结算、支付以及跟踪订单。概要设计说明书是软件开发过程中的一个关键文档,它在项目的需求分析之后,详细设计之前编写,旨在概述...
【保险IT整体架构概述】 保险行业的信息技术架构是支撑...宏天信业通过其丰富的产品线和服务,为保险行业提供了一个集成化、灵活且安全的IT架构,帮助保险公司适应不断变化的市场环境,优化业务流程,提升客户满意度。
该文档由北京宏天德美数码科技有限公司编制,旨在满足苏州广电在新媒体时代对内容传输、用户交互以及业务管理的多元化需求。 1. **概述** 本项目旨在升级和优化苏州广电的现有系统,以支持互动电视、个性化服务和...