Angular-ui-router + oclazyload + requirejs实现资源随route懒加载

  刚开始用angularjs作项目的时候,我用的是ng-router,以为加载并很差。因此就用了ui-router,考虑到在app上网页加载速度太慢,因此我就想到了用懒加载,看下是否能提高性能,提升加载速度。 那使用懒加载,就要对项目进行进一步的拆分,我以为这个拆分,能够提升我对angularjs的理解。html

  

本文主要说明在用AngularJS开发web应用中如何实现lazyload,使用AngularJS须要在前端实现路由功能,本文就介绍利用此点实现前端资源的懒加载。前端

问题

目前大部分AngularJS的应用用requirJS组织模块,可是不少都没有使用lazyload功能,在app.js中启动时将所有依赖加载进来,在模块功能较少,前端资源少的状况下没问题。那么问题来了,依赖资源过多时怎么办?angularjs

  1. build时利用grunt-contrib-requirejs提取合并文件,减小http请求,可是存在问题:build后文件大;线上调试不方便,尤为在html2js后问题更明显。
  2. 开发中尽可能在原有文件里进行新业务添加,不增长额外的http请求压力,可是存在问题:多人合做时须要常常处理代码冲突;单个文件(control,directive等)很大,看的是眼花缭乱,容易出问题。

解决问题

基本思路:在路由切换时加载所须要资源。
工具:Angular-ui-router,oclazyload,requirejs。web

  • 配置oclazyload
    在引入oclazyload文件后配置主要参数项
    复制代码
        app.config(['$ocLazyLoadProvider',function($ocLazyLoadProvider){
            $ocLazyLoadProvider.config({
                loadedModules: ['monitorApp'],//主模块名,和ng.bootstrap(document, ['monitorApp'])相同
                jsLoader: requirejs, //使用requirejs去加载文件
                files: ['modules/summary','modules/appEngine','modules/alarm','modules/database'], //主模块须要的资源,这里主要子模块的声明文件
                debug: true
            });
       }]);
    复制代码

     

  • 配置ui-route
    利用angularjs-ui-route配置路由跳转的基本规则和须要懒加载文件
    复制代码
        app.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider){
            var lazyDeferred;
            /**
             * 路由切换时调用
             * @param param.file 懒加载文件数组
             * @param tpl 子模块view视图
             * @param module 子模块名
             */
            function resovleDep(param,tpl,module){
                var resolves = {
                    loadMyCtrl: ['$ocLazyLoad', '$templateCache', '$q', function($ocLazyLoad,$templateCache,$q) {
                        lazyDeferred = $q.defer();
                        return $ocLazyLoad.load({
                            name : module,
                            cache: false,
                            files: param.files
                        }).then(function() {
                            lazyDeferred.resolve($templateCache.get(tpl));
                        });
                    }]
                };
                return resolves;
            };
    
            $urlRouterProvider.otherwise('/summary');
            //路由配置
            $stateProvider
                .state('module1', {
                    url:'/module1',
                    templateProvider: function() { return lazyDeferred.promise; },
                    controller: 'module1Controller',
                    resolve : resovleDep({files:[
                        'controllers/module1Ctrl',
                        'services/module1Service',
                        'directives/module1Directive'
                    ]}, 'views/module1.html', 'app.module1')
                })
                .state('module2', {
                    abstract: true,
                    url: '/module2',
                    templateUrl: 'views/module2.html'
                })
                .state('module2.list', {
                    url: '',
                    templateProvider: function() { return lazyDeferred.promise; },
                    controller: 'module2Controller',
                    resolve : resovleDep({files:[
                        'controllers/module2ListCtrl',
                        'services/module2Service'
                    ]}, 'views/list.html', 'app.module1')
                })
                .state('module1.detail', {
                    url: '/:id',
                    templateProvider: function() { return lazyDeferred.promise; },
                    controller: 'detailController',
                    resolve : resovleDep({files:[
                         'controllers/detailCtrl',
                         'services/detailService'
                    ]}, 'views/detail.html', 'app.module2')
                });
        }]);
    复制代码

     

结束

ok,至此就能够在路由切换时方便的加载子模块和依赖资源,oclazyload和ui-router还有不少可挖掘的,你们可参考api知足需求。
ps:最初用angular-route+oclazyload作时出现:bootstrap

multiple directives asking for isolated scope on
multiple asking for template

等问题,很差用,建议使用ui-route,强大的多。api

 

 

文章来自:http://www.cnblogs.com/pengjv/p/4205962.html数组

相关文章
相关标签/搜索