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 相关文章推荐
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
jQuery控制iFrame(实例代码)
Nov 19 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Jan 12 Javascript
JavaScript必知必会(二) null 和undefined
Jun 08 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
Jan 24 Javascript
vue + socket.io实现一个简易聊天室示例代码
Mar 06 Javascript
js 两个日期比较相差多少天的实例
Oct 19 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
vue.js实现标签页切换效果
Jun 07 Javascript
基于vue-upload-component封装一个图片上传组件的示例
Oct 16 Javascript
JS函数式编程实现XDM一
Jun 16 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
与数据库连接
2006/10/09 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
Python单元测试实例详解
2018/05/25 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
python实现简易动态时钟
2018/11/19 Python
python tkinter实现屏保程序
2019/07/30 Python
python实现多进程通信实例分析
2019/09/01 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
Python中itertools的用法详解
2020/02/07 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
总经理岗位职责
2013/11/09 职场文书
房屋改造计划书
2014/01/10 职场文书
打架检讨书50字
2014/01/11 职场文书
九年级语文教学反思
2014/02/04 职场文书
教师现实表现材料
2014/02/14 职场文书
5s推行计划书
2014/05/06 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书