angularjs + angular-couch-patato + requirejs

Sep 9, 2015


按需加载静态资源

angularjs + angular-couch-patato + requirejs

  • index.html
<script src="require.js" data-main="main.js?v=1.0"></script>
  • main.js
require.config({
    baseUrl: 'xxx',
    paths: {
             'jquery' : 'assets/js/jquery.min',
           'angular' : 'assets/js/angular'},
    shim: {
      angular: {
        deps: ['jquery'],
        exports: 'angular'
      }
    }
});
  • route.js
$stateProvider
    .state('index', {
        url: 'index/',
        templateUrl: 'xxxx.tpl.html',
        resolve: {
            ctrl: $couchPotatoProvider.resolveDependencies(['home.ctrl'])
        }
    })

Lazyload机制

Lazyload机制可以使状态流转的时候去按需加载页面所需的资源,而不是在一开始就加载。AngularJS本身没有实现lazyload,这样的话就导致了webapp的性能受影响,在首次加载的时候就要加载全部的依赖。

define angular module

var app = angular.module('app', ['scs.couch-potato', 'ui.router', 'ui.bootstrap', 'ui.bootstrap.tpls', 'chieffancypants.loadingBar']);

上述代码片段展示了Angular module的加载机制。而在实际应用中,特别是业务系统,一般是业务比较繁杂,功能模块比较多,在这种情况下,angular module的默认机制就不符合我们要求了。

因此,我们采用requirejs + angular-couch-patato来实现Lazyload。angular-couch-patato负责托管angular的各种注册,包括controller,directive,filter,service等。平时我们写

angular.module('app').controller(function () {
    //ctrl code here
    });

To use LazyLoad,we need to change as follows:

angular.module('app').registerController(function () {
    //ctrl code here
    });

将部件注册,这样所有的部件都交给couch-patato来管理,在需要的时候加上使用requirejs,app是统一管理的angular module,我们就这样写:

define(['app'], function(app) {
    app.registerController(function () {
    //ctrl code here
    });
 })

首先加载依赖app,app是之前定义好的angular module,如var app = angular.module(‘app’, [‘scs.couch-potato’, ‘ui.router’, ‘ui.bootstrap’, ‘ui.bootstrap.tpls’, ‘chieffancypants.loadingBar’]);。然后在app上注册controller等。

上文路由机制部分提到,在注册路由的时候需要调用$couchPotatoProvider.resolveDependencies来实现lazyload。这里设计到couchPatato实现的一个关键,就是利用angular在路由里面的resolve机制,这里的resolve是指,路由在触发之前,必须拿到resolve里面定义的所有值。这样couchPatato就有机会去获取定义的依赖,而在每个依赖里面,会将controller注册到app,然后在路由触发后,定义的controller才得以调用。