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 相关文章推荐
JavaScript prototype对象的属性说明
Mar 13 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
Mar 21 Javascript
判断ie的两种简单方法
Aug 12 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
Oct 17 Javascript
使用AngularJS 应用访问 Android 手机的图片库
Mar 24 Javascript
jquery中val()方法是从最后一个选项往前读取的
Sep 06 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
JS鼠标3次点击事件实现代码及扩展思路
Sep 12 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
小程序实现分类页
Jul 12 Javascript
关于layui导航栏不展示下拉列表的解决方法
Sep 25 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
跨浏览器的事件对象介绍
2012/06/27 Javascript
移动节点的jquery代码
2014/01/13 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
python 获取list特定元素下标的实例讲解
2018/04/09 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
优秀员工自荐书范文
2013/12/08 职场文书
授权委托书
2014/09/17 职场文书
小学生安全保证书
2015/05/09 职场文书
导游词之太湖
2019/10/08 职场文书
python关于集合的知识案例详解
2021/05/30 Python
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL