angularjs的一些优化小技巧


Posted in Javascript onDecember 06, 2014

关于优化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很强大,但是不规范的代码也会破坏它的性能,所以在写代码之前最好构思下哪些地方是不需要监听器的.

Javascript 相关文章推荐
JQuery读取XML文件数据并显示的实现代码
Dec 16 Javascript
javascript中的变量是传值还是传址的?
Apr 19 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
Apr 16 Javascript
javascript动态加载二
Aug 22 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
May 31 Javascript
多个$(document).ready()的执行顺序实例分析
Jul 26 Javascript
JavaScript脚本判断蜘蛛来源的方法
Sep 22 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
Sep 23 Javascript
Javascript中字符串replace方法的第二个参数探究
Dec 05 Javascript
layui富文本编辑器前端无法取值的解决方法
Sep 18 Javascript
vue-router 2.0 跳转之router.push()用法说明
Aug 12 Javascript
JavaScript实现简单计时器
Jun 22 Javascript
JavaScript开发人员的10个关键习惯小结
Dec 05 #Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 #Javascript
node.js中实现同步操作的3种实现方法
Dec 05 #Javascript
node.js实现BigPipe详解
Dec 05 #Javascript
js实现点击添加一个input节点
Dec 05 #Javascript
Node.js实现的简易网页抓取功能示例
Dec 05 #Javascript
浅谈js的setInterval事件
Dec 05 #Javascript
You might like
xml+php动态载入与分页
2006/10/09 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
php实现等比例压缩图片
2018/07/26 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
学习ExtJS 访问容器对象
2009/10/07 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
八年级历史教学反思
2014/01/10 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
文明工地标语
2014/06/16 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
导游词幽默开场白
2019/06/26 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python