angularjs性能优化的方法

 更新时间:2018年09月05日 10:30:44   作者:喵先生的进阶之路  
这篇文章主要介绍了angularjs性能优化的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

学习angularjs有一段时间了,但是一直都没有怎么考虑过性能方面的问题,上次在研究过滤器的时候涉及到了性能问题。所以自己也总结了下常用的性能优化。

优化$watch

1.及时移除不必要的watch

var unWatch = $scope.$watch('', function() {
  // do something
  ...
  if (someCondition) {
    unWatch();  // 取消监听
  }
});

2.尽量避免深度watch

我们都知道$watch有三个参数,第三个参数为true就是要深度监听的。这个参数主要是在嵌套对象的时候会用到,但是要尽量避免使用,如果你只是想看看基本属性的变化,那么就不要使用第三个参数进行深度的监听,这回大大拖慢每一次监听的时间。

3.ng-if和ng-show

尽量使用ng-if,因为前者不仅会移除DOM,还会移除相应的watch。

而ng-show只是简单的隐藏,但其实已经加载完成。

ng-show指令在特定的元素上切换CSS显示属性,而ng-if指令实际上会先从DOM中删除元素,如果在需要的话重新创建。此外,ng-switch指令是ng-if的替代方案,具有相同性能优势。

$apply和$digest

$apply会使angular进入$digest循环,然后从$rootScope开始遍历,检查变更。

$digest只会检查当前scope以及其子scope。

所以,但我们确定某个操作只会影响当前的scope,使用$digest会稍微提升性能。

优化ng-repeat

ng-repeat真是使用比较多的指令了,但是好像经常忽略track by。

建议避免在JavaScript中使用ng-repeat来构建HTML。对于某些应用程序来说,使用ng-repeat会增加不必要的监视者。使用ng-bind-html指令是解决这个问题的更好的办法。

我们的ng-repeat经常就这么写:

ng-repeat="item in items"

但是如果这么写的话,当我们刷新页面的时候,它会删除所有已有的DOM,然后重新创建和渲染。但是如果我们加上track by就不同了:

ng-repeat="item in item track by item.id"

这样angular就会复用已有的DOM,然后更新变化的部分。这就减少了不必要的渲染。

使用$watchCollection(包括第三个参数)

通常在使用$watch的时候只会用到两个参数,但是如果加上第三个参数的话,例如`$watch('value',function(){},true)`,则可以让Angular执行深度检查(检查对象的每个属性)。但这可能会带来更多的性能开销。因此,为了解决这个性能问题,Angular提供了`$watchCollection('value', function(){})`,它的第三个参数的功能与$watch的几乎相同,只是它只检查对象属性的第一层,以降低性能开销。

使用console.time来调试问题

如果你在对应用程序努力地进行调试,以解决性能问题的话,请使用console.time,这是一个非常棒的API。

去抖ng-model

你可以使用ng-model来去除输入。例如,要撤销像GOOGLE这样的搜索输入的话,你必须使用ng-model-options=”{debounce:250}”。由于输入模型发生了变化,使得digest cycle每250ms触发不超过一次。

其他优化

console.log很耗时,发布的时候一定要干掉。

慎用filter,可以在controller中预先处理。

尽量避免使用广播事件,可以使用双向数据绑定或者共享service等方法代替。

总结

我总结的还不是很全,都只是我常用到的。随着更多的使用,理解也会更进一步的加深。

参考:https://github.com/atian25/blog/issues/5

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • angularjs实现的前端分页控件示例

    angularjs实现的前端分页控件示例

    本篇文章主要介绍了angularjs实现的前端分页控件示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 浅谈Angular中ngModel的$render

    浅谈Angular中ngModel的$render

    下面小编就为大家带来一篇浅谈Angular中ngModel的$render。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • AngularJS 霸道的过滤器小结

    AngularJS 霸道的过滤器小结

    本篇文章主要介绍了AngularJS 霸道的过滤器小结,在实际操作中,我们需要对统一数据源进行多次转换,本文详细讨论有关过滤器的用法 。
    2017-04-04
  • 如何以Angular的姿势打开Font-Awesome详解

    如何以Angular的姿势打开Font-Awesome详解

    这篇文章主要给大家介绍了关于如何以Angular的姿势打开Font-Awesome的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Angular具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • AngularJS中实现显示或隐藏动画效果的方式总结

    AngularJS中实现显示或隐藏动画效果的方式总结

    AngularJS 是一组用于创建单页Web应用的丰富框架,给构建丰富交互地应用带来了所有功能,其中一项主要的特性是Angular对动画的支持。下面通过本文给大家介绍AngularJS中实现显示或隐藏动画效果的方式总结,对angularjs动画效果相关知识感兴趣的朋友一起学习
    2015-12-12
  • Angularjs在初始化未完毕时出现闪烁问题的解决方法分析

    Angularjs在初始化未完毕时出现闪烁问题的解决方法分析

    这篇文章主要介绍了Angularjs在初始化未完毕时出现闪烁问题的解决方法,结合实例形式分析了3种常用的闪烁问题解决方法,需要的朋友可以参考下
    2016-08-08
  • 对angularJs中自定义指令replace的属性详解

    对angularJs中自定义指令replace的属性详解

    今天小编就为大家分享一篇对angularJs中自定义指令replace的属性详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Angular.js实现获取验证码倒计时60秒按钮的简单方法

    Angular.js实现获取验证码倒计时60秒按钮的简单方法

    最近做项目的时候又遇到了验证码倒计时的需求,发现这个功能还是挺实用的,所以就想着总结一下,下面这篇文章主要给大家介绍了关于利用Angular.js如何实现获取验证码倒计时按钮的简单方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • AngularJs表单验证实例代码解析

    AngularJs表单验证实例代码解析

    这篇文章主要介绍了AngularJs表单验证实例代码解析,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Angularjs中数据绑定的实例详解

    Angularjs中数据绑定的实例详解

    这篇文章主要介绍了Angularjs中数据绑定的实例详解的相关资料,这里提供简单实例,大家可以参考下,希望通过本文可以掌握这部分内容,需要的朋友可以参考下
    2017-08-08

最新评论