angularjs性能优化的方法


Posted in Javascript onSeptember 05, 2018

学习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

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

Javascript 相关文章推荐
转一个日期输入控件,支持FF
Apr 27 Javascript
js正文内容高亮效果的实现方法
Jun 30 Javascript
JavaScript?Apple设备检测示例代码
Nov 15 Javascript
javascript将相对路径转绝对路径示例
Mar 14 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
Aug 10 Javascript
jQuery模仿单选按钮选中效果
Jun 24 Javascript
微信小程序前端源码逻辑和工作流
Sep 25 Javascript
js实现点击图片自动提交action的简单方法
Oct 16 Javascript
mui上拉加载功能实例详解
Apr 13 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
vue-router 实现导航守卫(路由卫士)的实例代码
Sep 02 Javascript
js实现特别简单的钟表效果
Sep 14 Javascript
jQuery实现获取及设置CSS样式操作详解
Sep 05 #jQuery
在vue中给列表中的奇数行添加class的实现方法
Sep 05 #Javascript
Vue.js 实现数据展示全部和收起功能
Sep 05 #Javascript
浅谈vue 单文件探索
Sep 05 #Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
Sep 05 #Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 #jQuery
vue中动态添加class类名的方法
Sep 05 #Javascript
You might like
重置版宣传动画
2020/04/09 魔兽争霸
PHP实现图片压缩的两则实例
2014/07/19 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
angular.bind使用心得
2015/10/26 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
使用JS动态显示文本
2017/09/09 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
python实现ftp客户端示例分享
2014/02/17 Python
python实现微信自动回复功能
2018/04/11 Python
使用python存储网页上的图片实例
2018/05/22 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
自荐信的禁忌和要点
2013/10/15 职场文书
干部下基层实施方案
2014/03/14 职场文书
大学专科自荐信
2014/06/17 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
小学六年级毕业感言
2015/07/30 职场文书
Python多个MP4合成视频的实现方法
2021/07/16 Python