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 相关文章推荐
JavaScript学习笔记(一) js基本语法
Oct 25 Javascript
jquery通过a标签删除table中的一行的代码
Dec 02 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
Jan 15 Javascript
浅谈JavaScript中的作用域和闭包问题
Jul 07 Javascript
Jquery鼠标放上去显示全名的实现方法
Feb 06 Javascript
解析Vue.js中的组件
Feb 02 Javascript
深入浅析AngularJs模版与v-bind
Jul 06 Javascript
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
微信小程序实现两个页面传值的方法分析
Dec 11 Javascript
Vue项目中使用flow做类型检测的方法
Mar 18 Javascript
Vuex实现购物车小功能
Aug 17 Javascript
jQuery-App输入框实现实时搜索
Nov 19 jQuery
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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
Python如何实现MySQL实例初始化详解
2017/11/06 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
使用django自带的user做外键的方法
2020/11/30 Python
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
应届本科生推荐信范文
2013/12/25 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
小学信息技术教学反思
2016/02/16 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
党风廉政建设心得体会
2019/05/21 职场文书