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 相关文章推荐
javascript验证上传文件的类型限制必须为某些格式
Nov 14 Javascript
document.forms[].submit()使用介绍
Feb 19 Javascript
jquery-syntax动态语法着色示例代码
May 14 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
javascript常用正则表达式汇总
Jul 31 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 Javascript
JS实现兼容性较好的随屏滚动效果
Nov 09 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
May 07 Javascript
JavaScript编程中实现对象封装特性的实例讲解
Jun 24 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
Jun 25 Javascript
基于AngularJS前端云组件最佳实践
Oct 20 Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
js数组的基本使用总结
2021/01/18 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
python通过索引遍历列表的方法
2015/05/04 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
Python生成器generator原理及用法解析
2020/07/20 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
上班离岗检讨书
2014/09/10 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
培训通知
2015/04/17 职场文书
2019求职信大礼包
2019/05/15 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python