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 TO HTML 转换
Jun 26 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
Nov 09 Javascript
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
jQuery选择器源码解读(三):tokenize方法
Mar 31 Javascript
JavaScript中的Math.LOG2E属性使用详解
Jun 14 Javascript
javascript中$(function() {});写与不写有哪些区别
Aug 10 Javascript
JS仿JQuery选择器功能
Mar 08 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 jQuery
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 Javascript
详解Vue template 如何支持多个根结点
Feb 10 Javascript
JS数组去重详情
Nov 07 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
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
PHP序列化操作方法分析
2016/09/28 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
介绍一下MD5加密算法
2016/11/12 面试题
《画杨桃》教学反思
2014/04/13 职场文书
活动总结报告范文
2014/05/04 职场文书
党员承诺书怎么写
2014/05/20 职场文书
节约用水标语
2014/06/11 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
离婚财产分割协议书
2015/08/11 职场文书
运动会广播稿200字
2015/08/19 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android