AngularJS 整理一些优化的小技巧

 更新时间:2016年08月18日 11:23:11   投稿:lqh  
本文主要介绍AngularJS 一些优化上的小技巧,这里整理了几种方法供大家参考,有兴趣的小伙伴可以参考下

关于优化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 优化方面的资料整理后续继续补充相关资料,谢谢大家对本站的支持!

相关文章

  • AngularJS实现注册表单验证功能

    AngularJS实现注册表单验证功能

    这篇文章主要为大家详细介绍了AngularJS实现注册表单验证功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 详解Angular CLI + Electron 开发环境搭建

    详解Angular CLI + Electron 开发环境搭建

    本篇文章主要介绍了Angular CLI + Electron 开发环境搭建,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • AngularJS动态生成select下拉框的方法实例

    AngularJS动态生成select下拉框的方法实例

    这篇文章主要给大家介绍了关于AngularJS动态生成select下拉框的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用AngularJS具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • AngularJS 实现JavaScript 动画效果详解

    AngularJS 实现JavaScript 动画效果详解

    本文主要介绍AngularJS 实现 JavaScript 动画的资料,这里整理了详细的资料和简单示例代码,有兴趣的小伙伴可以参考下
    2016-09-09
  • AngularJS入门教程(零):引导程序

    AngularJS入门教程(零):引导程序

    这篇文章主要介绍了AngularJS入门教程(零):引导程序,本文是系列文章中的一篇,本系列文章用开发一个AngularJS应用来讲解,需要的朋友可以参考下
    2014-12-12
  • Angularjs的Controller间通信机制实例分析

    Angularjs的Controller间通信机制实例分析

    这篇文章主要介绍了Angularjs的Controller间通信机制,结合实例形式分析了Controller通信机制的原理、实现技巧与相关操作技巧,需要的朋友可以参考下
    2016-11-11
  • Angular 4.x中表单Reactive Forms详解

    Angular 4.x中表单Reactive Forms详解

    这篇文章主要介绍了Angular 4.x中表单Reactive Forms的相关资料,文中通过示例代码介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-04-04
  • 浅谈angular2 组件的生命周期钩子

    浅谈angular2 组件的生命周期钩子

    本篇文章主要介绍了浅谈angular2 组件的生命周期钩子,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Angular2使用SVG自定义图表(条形图、折线图)组件示例

    Angular2使用SVG自定义图表(条形图、折线图)组件示例

    这篇文章主要介绍了Angular2使用SVG自定义图表(条形图、折线图)组件,涉及Angular结合svg进行图表绘制的相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • angular.js中解决跨域问题的三种方式

    angular.js中解决跨域问题的三种方式

    跨域,前端开发中经常遇到的问题,下面这篇文章主要给大家介绍了关于angular.js中解决跨域问题的三种方式,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07

最新评论