对AngularJS项目进行性能调优的几个总结

感觉

我本是java出身,在做了几个angular的项目后,发现angular身上有java框架的影子,在在网上看看有没有人跟我有同感,发现确实如此。同为Google的子嗣,看来基因真的很强大,不过女大18变的NG2.0是不是脱胎换骨,我会去跟这位女子更亲密的接触看看;

言归正传。

当绑定对象超过 2000 时性能会明显下降,当然这不是一个精确的数字。很明显,针对这一点,我们应该减少双向绑定的数据,比如使用once-bound,像这样``(v1.3+)。

在网上见到过一段计算render时间的代码,既是分享也是记录:

// Post repeat directive for logging the rendering time  
angular.module('siApp.services').directive('postRepeatDirective',   
  ['$timeout', '$log',  'TimeTracker',   
  function($timeout, $log, TimeTracker) {  
    return function(scope, element, attrs) {  
      if (scope.$last){  
         $timeout(function(){  
             var timeFinishedLoadingList = TimeTracker.reviewListLoaded();  
             var ref = new Date(timeFinishedLoadingList);  
             var end = new Date();  
         });  
       }  
    };  
  }  
]);  
// Use in HTML:  
<tr ng-repeat="item in items" post-repeat-directive></tr> 

当然也可以使用Batarang(chrome的插件)来进行性能测试;

尽量不要使用内联的方法计算数据

// bad  
<tr ng-show="item('args').length>0"></tr> 
// better 
<tr ng-show="item('args').length>0"></tr> 

ng-if来代替ng-show

ng-if会阻止渲染。允许是可以使用ng-if来代替ng-show。

防抖动输入

在较早的版本中可能还要自己写代码,延迟$digest()循环,但是v1.3后,可以直接使用$debounce(详细的options可以查看API):

<input ng-model="userName" ng-model-options="{ debounce: 300 }" />

合理使用$destroy

AngularJS在销毁一个scope和把一个scope从它的父级移除之前会广播一个$destroy事件。监听这个事件对清理任务和资源是至关重要的,否则可能会继续消耗内存或CPU。

$scope.$on("$destroy", function() {
    //清理内存的代码......
    if (timer) {
        $timeout.cancel(timer);
    }
    //......
});