AngularJS 整理一些优化的小技巧


Posted in Javascript onAugust 18, 2016

关于优化ng的手段网上已经有很多了,核心都是从$$watchers这个作用域内部属性说起的,今天我来说点别的,本质还是不变的,因为这是ng的硬伤,不过我相信只要运用合适的手法,这些问题还是可以避免的.

ng简介

angularjs简称ng,是google出品的mvvm框架,此在提高前端项目开发效率(实践中来看确实很能提高开发效率),以控制器,指令,服务来围绕整个项目,内部以独有的DI来解决三层之前的调用问题.更多的详情信息可以参考我之前写的ng源码分析.

ng的硬伤

说到硬伤就要先说下它的简单的数据绑定原理

ng里每个页面上定义的model其实都会在当前作用域下添加一个监听器,内部容器就是$$wachers数组,只要页面任何一个model发生变化了,就会触发作用域内部$digest方法,它会依次查找当前作用域树里的所有model,是保证页面上的模型能得到数据同步,所以这个是非常消耗程序时间的,官方的说法就是当页面上出现2000个监听器时,页面性能就会明显下降.所以要提高ng的性能,就要从这方面入手了.

tip1: 一次绑定

其实这个网上别人已经说过了,这里说下新的用法,ng的1.3.0+的版本已经内置提供了一个语法来支持模型只绑定一次的情况,看下面的例子

old code

hello

new code

hello

 可以看到新的语法就是在model前面加上::,相信这个语法要比网上用的第三方插件要方便的多了.

tip2: $scope.$digest vs $scope.$apply

相信很多人对$apply方法不陌生,它一般用在,当不在ng的环境里执行代码的时候,为了保证页面的数据同步,在代码执行完成之后调用$apply方法会触发内部$digest来检查作用域里所有的模型,其实在它的内部是这样调用的,下面只写出一些代码片段

...
...
$rootScope.$digest
...
...

 所有它其实是调用$rootScope根作用域下的$digest,那么不同作用域下的$digest有什么区别呢?其实最重要的区别就在于

$digest 只深度查找调用方下面所有的模型

所以$scope跟$rootScope相比,要节省掉很多查找模型的时间.

不过想要保证页面上所有模型数据的同步,还是得调用$rootScope的,所以在写代码之前最好想想哪些数据是要同步变化的.

tip3: 尽可能少调用 ng-repeat

ng-repeat默认会创建很多监听器,所以在数据量很大的时候,这个非常消耗页面性能,我觉的只有在当需要经常更新数据列表的时候才需要用ng-repeat,要不然放那么多的监听器在那里也是浪费,这时候可以用ng自带的$interpolate服务来解析一个代码片段,类似于一个静态模板引擎,它的内部主要依赖ng核心解析服务$parse,然后把这些填充数据之后的代码片段直接赋给一个一次性的模型性就可以.

tip4: 尽量在指令里写原生语法

虽然ng提供了很多的指令比如ng-show,ng-hide,其实它们作用就是根据模型的true,false来显示或隐藏一个代码片段,虽然能够很快速的实现业务要求,但是这些指令还是默认会添加监听器,假如这些代码片段存在于一个大的指令里面时,更好的方法是在指令link里编写.show(), .hide()这些类似的jq方法来控制比较好,这样可以节省监听器的数量,类似的还有自带的事件指令,这些其实都可以在外围指令里通过使用addEventListener来绑定事件,反正在写代码之前,最好想想怎么样来使监听器的数量最少,这样才能全面的提高页面性能.

tip5: 页面内尽量少用filters

当在页面内的模型后面增加filter时,这个会造成当前模型在$digest里运行两次,造成不必要的性能浪费.第一次在$$watchers检测任务改变时;第二次发生在模型值修改时,所以尽量少用内联时的过滤器语法,像下面这样的非常影响页面性能

推荐使用$filter服务来调用某个过滤器函数在后台,这样能明显的提高页面性能,代码如下

$filter('filter')(array, expression, comparator);

总结

上面都是些提高ng项目性能的一些小技巧,虽然ng很强大,但是不规范的代码也会破坏它的性能,所以在写代码之前最好构思下哪些地方是不需要监听器的.

以上就是对AngularJS 优化方面的资料整理后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 Javascript
jquery URL参数判断,确定菜单样式
May 31 Javascript
基于Jquery的标签智能验证实现代码
Dec 27 Javascript
jquery队列queue与原生模仿其实现方法分享
Mar 25 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
JS应用正则表达式转换大小写示例
Sep 18 Javascript
jquery显示隐藏元素的实现代码
May 19 Javascript
jQuery事件绑定用法详解
Sep 08 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
实例讲解JS中pop使用方法
Jan 27 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
Aug 18 #Javascript
js获取form表单所有数据的简单方法
Aug 18 #Javascript
Javascript中浏览器窗口的基本操作总结
Aug 18 #Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
Aug 18 #Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
Aug 18 #Javascript
jQuery fadeOut 异步实例代码详解
Aug 18 #Javascript
AngularJS 工作原理详解
Aug 18 #Javascript
You might like
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
javascript 事件绑定问题
2011/01/01 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
深入学习JavaScript 高阶函数
2019/06/11 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
python画折线图的程序
2018/07/26 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
python 自动重连wifi windows的方法
2018/12/18 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
仓管员岗位职责范文
2013/11/08 职场文书
手机银行营销方案
2014/03/14 职场文书
新手上路标语
2014/06/20 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
陪护人员误工证明
2015/06/24 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
python 爬取天气网卫星图片
2021/06/07 Python
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis