`
美丽心情19801230
  • 浏览: 5474 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Sencha Touch延迟加载模块提高程序启动时性能

阅读更多

  目前一段时间一直做移动终端开发,使用框架为Sencha Touch,Sencha Touch是基于Html5和Ext的,所以在性能上存在很大的问题,尤其是打开程序的时候需要加载很多模块的javascript类,严重影响了程序进入时的速度,随着模块的增多,速度越来越慢。能优化的已经都优化了,比如把各个模块的model,view,store都放到每个模块的Controller里面单独引入,但是每个模块的Controller是必须要在程序初始化的时候加载的,否则进入模块的时候就会报类找不到异常,目前的代码如下:

controllers : [
               "mobile.common.phone.BottomTabPhoneController", 
               "mobile.common.tablet.BottomTabTabletController", 
               "mobile.common.SlideViewController",
               "mobile.common.organize.OrganizeController",
               "mobile.cyyw.CyywController",
               "mobile.user.UserController",
               "mobile.business.AllBusinessController",
               "mobile.qyyh.QyyhController",
               "mobile.home.HomePageController",
               "mobile.group.GroupController",
               "mobile.news.NewsController",
               "mobile.txl.TxlController",
               'mobile.blog.BlogController',
               "mobile.tdxx.TdxxController",
               "mobile.fyxx.FyxxController",
               "mobile.qyml.QymlController",
               "mobile.yzcxm.YzcxmController",
               "mobile.jjyxbg.JjyxbgController",
               "mobile.gzlc.GzlcController",
               "mobile.clzzjk.ClzzjkController",
               "mobile.pljk.PljkController",
               "mobile.zcjk.ZcjkController",
               "mobile.sjpc.SjpcController",
               "mobile.ptcb.PtcbController",
               "mobile.ytbcb.YtbcbController",
               "mobile.file.FileController",
               "mobile.rwap.RwapController",
               "mobile.syrw.SyrwController",
               "mobile.bdss.BdssController",
               "mobile.fwjk.FwjkController",
               "mobile.wdrw.WdrwController",
        ],

 这是我的全部模块的Controller,每个Controller里面又引入了该模块的model,view和store,进入程序时候速度慢就是这些Controller影响的,怎样才能在程序初始化的时候只加载必要的Controller而把其它不必要的模块延迟加载呢?查阅官方api并没有这方面的说明,但是问题必须要解决!后来考虑到Sencha Touch在初始化的时候是要加载所有Controller的,那能不能把Sencha Touch官方的代码拷贝出来用于延迟加载单独的Controller呢?抱着试试看的心理我在官方api中搜索有关Controller的代码,发现在Application.js中有一个loadControllerDependencies方法,代码如下:

loadControllerDependencies: function() {
        this.instantiateControllers();

        var controllers = this.getControllerInstances(),
            classes = [],
            stores = [],
            i, controller, controllerStores, name;

        for (name in controllers) {
            controller = controllers[name];
            controllerStores = controller.getStores();
            stores = stores.concat(controllerStores);

            classes = classes.concat(controller.getModels().concat(controller.getViews()).concat(controllerStores));
        }

        this.setStores(this.getStores().concat(stores));

        Ext.require(classes, this.onDependenciesLoaded, this);
    },

 其中instantiateControllers方法代码如下:

/**
     * @private
     * Called once all of our controllers have been loaded
     */
    instantiateControllers: function() {
        var controllerNames = this.getControllers(),
            instances = {},
            length = controllerNames.length,
            name, i;

        for (i = 0; i < length; i++) {
            name = controllerNames[i];

            instances[name] = Ext.create(name, {
                application: this
            });
        }

        return this.setControllerInstances(instances);
    },

 由代码可以看出,instantiateControllers方法就是实例化Controller本身的方法,而loadControllerDependencies方法还包含了初始化Controller中model,view和store的代码,最后一行代码还包含了一个回调函数onDependenciesLoaded,代码如下:

/**
     * @private
     * Callback that is invoked when all of the Application, Controller and Profile dependencies have been loaded.
     * Launches the controllers, then the profile and application.
     */
    onDependenciesLoaded: function() {
        var me = this,
            profile = this.getCurrentProfile(),
            launcher = this.getLaunch(),
            controllers, name;

        this.instantiateStores();

        //<deprecated product=touch since=2.0>
        Ext.app.Application.appInstance = this;

        if (Ext.Router) {
            Ext.Router.setAppInstance(this);
        }
        //</deprecated>

        controllers = this.getControllerInstances();

        for (name in controllers) {
            controllers[name].init(this);
        }

        if (profile) {
            profile.launch();
        }

        launcher.call(me);

        for (name in controllers) {
            //<debug warn>
            if (controllers[name] && !(controllers[name] instanceof Ext.app.Controller)) {
                Ext.Logger.warn("The controller '" + name + "' doesn't have a launch method. Are you sure it extends from Ext.app.Controller?");
            } else {
            //</debug>
                controllers[name].launch(this);
            //<debug warn>
            }
            //</debug>
        }

        me.redirectTo(window.location.hash.substr(1));
    }

 经测试,其中需要用到的代码只有this.instantiateStores();这一行,功能是初始化Controller中的Store。

  找到了关键的代码,下一步要做的是把代码提出来为我作用,由于我需要在进入某个模块的时候再初始化这个模块的Controller,也就是每次只初始化一个Controller,所以里面的一些代码需要修改合并一下,修改合并后的代码如下:

//controllerName是Controller的全限定名,例如:"mobile.bdss.BdssController",mobile.app是当前Ext.app.Application的实例
if (Ext.isEmpty(mobile.app.getController(controllerName))) {
                        //获得已经实例化过的Controller
			var instances = mobile.app.getControllerInstances(),
                        //实例化当前模块的Controller
			controller = Ext.create(controllerName, {
				application: mobile.app
			});
                        //把当前模块的Controller加到实例数组中
			instances[controllerName]=controller;
                        //把Controller实例数组还给Ext.app.Application
			mobile.app.setControllerInstances(instances);
                        //把当前Controller中的Stroe赋值给Ext.app.Application
			mobile.app.setStores(controller.getStores());
			var classes=[];
			classes = classes.concat(controller.getModels().concat(controller.getViews()).concat(controller.getStores()));//获得所有类
			Ext.require(classes, function(){
				mobile.app.instantiateStores();
				
			}, mobile.app);
		}

   这样,在每次进入模块时都执行这段代码,如果没有实例化Controller就实例化,这样我就可以把开头那些不需要进入程序时就加载的Controller去掉,只保留必须的Controller,大大提高程序启动时的时间。

0
0
分享到:
评论
3 楼 lovelyelfpop 2017-03-02  
估计你没有用sencha cmd build 吧?
你这动态Ext.require类的方式,所以我猜你没有build,而还是一个个js文件。
一个个js文件那是开发模式,发布出来时是整合压缩的一个app.js。
2 楼 美丽心情19801230 2014-11-19  
sp42 写道
用过旧版,速度十分不给力……
目前最新版本是2.4.1,我用的版本是2.3.1,其实无论哪个版本性能都是问题,毕竟是基于Ext的
1 楼 sp42 2014-11-19  
用过旧版,速度十分不给力……

相关推荐

    sencha touch动态加载组件

    Sencha Touch是一款强大的移动应用开发框架,主要用于构建高性能的触屏友好型Web应用程序。它提供了丰富的组件库,使得开发者能够创建复杂、互动性极强的移动应用。在处理大型或内容丰富的应用时,动态加载组件成为...

    sencha touch图片懒加载

    Sencha Touch 是一款用于开发移动Web应用程序的JavaScript框架,它提供了丰富的组件和API,使得开发者可以构建出具有原生感的触控应用。在处理大量图片时,为了提高页面加载速度和节省用户流量,通常会采用“图片懒...

    touch-docs-2.2.1.zip(senchaTouch 离线API参考文档)

    总的来说,Sencha Touch 2.2.1离线API文档是开发者的宝贵资源,通过深入学习和查阅,开发者可以熟练掌握这一框架,从而构建高性能、用户体验优秀的移动应用。而将其部署至Tomcat服务器,更是提供了一种便捷的本地...

    Sencha 和 Sencha Touch 简介

    本文通过对 Sencha Touch 框架的介绍,使读者对该框架有一定的了解,并通过一些代码示例给用户更详细直观的对 Sencha Touch 框架功能的了解。 ExtJS ExtJS 是为 web 开发人员提供的基于 JavaScript 和 web 标准快速...

    sencha touch在VScode上的插件

    Sencha Touch 是一款用于构建移动应用的前端框架,它提供了丰富的组件库和强大的数据管理功能,使得开发者可以创建交互性强、性能优异的触屏应用程序。VSCode(Visual Studio Code)是微软开发的一款广受欢迎的源...

    一个完整的sencha touch 应用案例

    但在生产环境中,为了优化性能,我们会使用按需加载的精简版(如sencha-touch.js)。 3. **app.js**:这是应用程序的核心文件,定义了应用程序的架构,包括模型(Models)、视图(Views)、控制器(Controllers)和...

    Sencha Touch in Action

    《Sencha Touch in Action》是一本关于使用Sencha Touch进行跨平台移动开发的书籍,它详细介绍了Sencha Touch框架的使用方法和技巧。Sencha Touch是一个利用HTML5、CSS3和JavaScript创建移动Web应用程序的框架,它是...

    sencha touch项目源码

    Sencha Touch 是一款专为移动设备设计的前端框架,它提供了丰富的组件和API,用于构建交互式的、响应式的Web应用程序。这个项目源码是基于Sencha Touch开发的一个实例,通过研究这个项目,我们可以深入理解Sencha ...

    sencha touch 登陆界面

    Sencha Touch 是一款专为移动设备设计的JavaScript框架,它提供了丰富的组件库和强大的数据管理功能,用于构建高性能的触控应用。"sencha touch 登陆界面"这个主题,主要涉及的是如何使用Sencha Touch来设计和实现一...

    sencha touch list demo

    为了提高性能,Sencha Touch 使用虚拟滚动技术,只渲染当前可视区域内的列表项,而非一次性渲染所有数据。这使得大规模数据的列表也能流畅运行。 总结,"sencha touch list demo"展示了如何使用Sencha Touch的List...

    Sencha Touch开发的项目《般若人生》源码

    《般若人生》是一款基于Sencha Touch框架开发的移动应用项目。Sencha Touch是一个流行的...对于想要深入理解Sencha Touch框架或者提高移动Web开发技能的开发者来说,《般若人生》的源码是一个宝贵的参考资料。

    sencha touch 2.4.0最新版

    Sencha Touch 2.4.0 是一个专为移动设备设计的前端JavaScript框架,它使得开发者能够构建功能丰富的、响应式的Web应用程序,这些应用在智能手机、平板电脑等移动设备上表现得如同原生应用一样流畅。这个框架由Sencha...

    sencha touch中文翻译文档

    8. **性能优化**:提供优化技巧,如延迟加载、内存管理,以及如何利用Sencha CMD工具进行构建和压缩,以提高应用性能。 9. **API参考**:包含Sencha Touch 2的核心类和方法的中文API文档,方便开发者查阅和查询。 ...

    sencha touch应用程序

    Sencha Touch 是一款专为移动设备设计的前端框架,它允许开发者构建富交互式的Web应用程序,可以在各种智能手机和平板电脑上运行,无需考虑特定的设备API。标题中的“sencha touch应用程序”指的是使用Sencha Touch...

    PhoneGap+Sencha-touch2.0实现的android程序

    接着,在`app.js`中定义应用的配置和启动代码,以初始化Sencha Touch并加载你的视图。 6. **配置PhoneGap插件**:如果需要访问Android设备的特定功能,如摄像头或通知,需要在`config.xml`中配置相应的PhoneGap插件...

    Sencha Touch2环境搭建

    Sencha Touch 2是一款专为移动设备开发的前端框架,用于构建高性能的触控应用程序。它提供了丰富的组件库,使得开发者能够轻松创建出与原生应用相似的用户体验。本篇文章将详细阐述如何搭建Sencha Touch 2的开发环境...

    sencha touch sdk工具

    Sencha Touch SDK工具是开发移动应用的重要资源,尤其对于那些希望使用Sencha Touch框架构建触控友好、跨平台Web应用程序的开发者来说。Sencha Touch是一个强大的JavaScript库,它提供了丰富的UI组件和API,使得...

    Sencha Touch MVC 模式

    在Sencha Touch中,MVC(Model-View-Controller)模式是其核心架构,帮助开发者组织和分离代码,提高代码的可维护性和可扩展性。本文将深入探讨Sencha Touch的MVC模式以及如何使用。 ### MVC模式简介 MVC模式是一...

    senchaTouch和fusioncharts结合的实例

    Sencha Touch 是一个流行的JavaScript框架,专门用于构建触摸优化的移动Web应用程序,而FusionCharts则是一款强大的数据可视化工具,提供丰富的图表类型和交互效果。 在深入探讨这个实例之前,我们首先来了解这两个...

Global site tag (gtag.js) - Google Analytics