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 相关文章推荐
js和as的稳定传值问题解决
Jul 14 Javascript
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
node.js中的fs.symlinkSync方法使用说明
Dec 15 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
Apr 06 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
Oct 25 Javascript
three.js中文文档学习之如何本地运行详解
Nov 20 Javascript
把vue-router和express项目部署到服务器的方法
Feb 21 Javascript
详解Vue CLI3配置解析之css.extract
Sep 14 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
Javascript中window.name属性详解
Nov 19 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中解析带中文字符的url函数分享
2015/01/20 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
javascript求日期差的方法
2016/03/02 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
sublime text 3配置使用python操作方法
2017/06/11 Python
利用python获取Ping结果示例代码
2017/07/06 Python
Python模拟用户登录验证
2017/09/11 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
python是怎么被发明的
2020/06/15 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
我的网上商城创业计划书
2013/12/26 职场文书
元旦晚会感言
2014/03/12 职场文书
毕业设计说明书
2014/05/07 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
公司财务管理制度
2015/08/04 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis