-
-
Notifications
You must be signed in to change notification settings - Fork 107
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
AngularJS性能优化心得 #5
Comments
赞赞赞! |
mark!! |
赞,谢谢分享! |
赞 |
zan |
马克后看,赞! |
Nice |
mark |
2 similar comments
mark |
mark |
Nice! |
mark |
2 similar comments
mark |
mark |
赞 |
Mark! |
赞! |
1 similar comment
赞! |
新人学到了许多。非常感谢 |
very good thanks |
学习了~ |
多谢,很好 |
good, mark |
mark |
@changwei0708 我只能呵呵了... 自己看正文里面的那些图片, 就是我这边九游的应用的截图. 正妹 @RubyLouvre 你这事做的太不地道了吧, 全文转载我的, 还不注明出处. |
去博客园举报他 |
我想起了当年知乎约战的事情 |
知道为何很多地方都写着出处么? 因为它来源自我之前在多看上的读书笔记
|
@RubyLouvre 怎么看? |
1 similar comment
@RubyLouvre 怎么看? |
@RubyLouvre 怎么看? |
@atian25 看到楼上的@我就放心了 |
@diamont1001 @willworks 不要啊,闹着玩的 |
不嫌事大。。。 |
什么事,我从是一个到处飘着广告的网站中搬过来的。不知原作者啊。 |
恩,我相信 @RubyLouvre 这点素质还是有的 |
我可以将你这个地址 加到我博文中 |
@RubyLouvre 好吧~ 注明下吧, 不然哪天我又被你的粉丝纠正了~ |
原来是偷的别人的赃物。。。 |
原来不知原作者就可以当做自己的东西发布了,厉害。这个借口可以用一辈子。 |
我觉的就算是到处飘着广告的网站也还是得贴上那个网站地址。。 |
我不太明白为什么明明是转载也不标明非原创。。。 |
mark |
受教了,还是感谢下。。。 ps:下面一堆大神出没。。。 |
mark |
比较好奇是哪三本书。。 |
很老的了,不适合现在
发自我的 iPhone
… 在 2017年8月19日,23:08,Christina ***@***.***> 写道:
比较好奇是那三本书。。
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
现在呢 老哥 继续用的1吗 还是2 或者4 了 |
早弃坑了,vue
发自我的 iPhone
… 在 2017年10月21日,17:02,Dany ***@***.***> 写道:
现在呢 老哥 继续用的1吗 还是2 或者4 了
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
Vue 文档确实很棒 |
脏数据检查 != 轮询检查更新
谈起angular的
脏检查机制(dirty-checking)
, 常见的误解就是认为: ng是定时轮询去检查model是否变更。其实,ng只有在指定事件触发后,才进入
$digest cycle
:ng-click
)$http
)$location
)$timeout
,$interval
)$digest()
或$apply()
$digest后批量更新UI
传统的JS MVC框架, 数据变更是通过setter去触发事件,然后立即更新UI。
而angular则是进入
$digest cycle
,等待所有model都稳定后,才批量一次性更新UI。这种机制能减少浏览器repaint次数,从而提高性能。
提速 $digest cycle
关键点
优化$watch
$scope.$watch(watchExpression, modelChangeCallback)
, watchExpression可以是String或Function。console.log
也很耗时,记得发布时干掉它。(用grunt groundskeeper)ng-if vs ng-show
, 前者会移除DOM和对应的watchbindonce
)避免深度watch, 即第三个参数为true
减少watch的变量长度
如下,angular不会仅对{% raw %}
{{variable}}
{% endraw %}建立watcher,而是对整个p标签。双括号应该被span包裹,因为watch的是外部element
{% endraw %}
$apply vs $digest
$digest cycle
, 并从$rootScope开始遍历(深度优先)检查数据变更。延迟执行
$timeout
里面延迟执行。$apply
。$evalAsync
vs$timeout
$evalAsync
, 会在angular操作DOM之后,浏览器渲染之前执行。$evalAsync
, 会在angular操作DOM之前执行,一般不这么用。$timeout
,会在浏览器渲染之后执行。优化ng-repeat
限制列表个数
$scope.dataList = convert(dataFromServer)
使用 track by
刷新数据时,我们常这么做:
$scope.tasks = data || [];
,这会导致angular移除掉所有的DOM,重新创建和渲染。若优化为
ng-repeat="task in tasks track by task.id
后,angular就能复用task对应的原DOM进行更新,减少不必要渲染。参见:http://www.codelord.net/2014/04/15/improving-ng-repeat-performance-with-track-by
使用单次绑定
我们都知道angular建议一个页面最多2000个双向绑定,但在列表页面通常很容易超标。
譬如一个滑动到底部加载下页的表格,一行20+个绑定, 展示个100行就超标了。
下图这个只是一个很简单的列表,还不是表格,就已经这么多个了:
但其实很多属性显示后是几乎不会变更的, 这时候就没必要双向绑定了。(不知道angular为何不考虑此类场景)
如下图,改为bindonce或angular-once后减少了很多:
update:
1.3.0b10开始支持内建单次绑定, {% raw %}
{{::variable}}
{% endraw %}设计文档:http://t.cn/RvIYHp9
commit: http://t.cn/RvIYHpC
目前该特性的性能似乎还有待优化(2x slower)
慎用filter
在$digest过程中,filter会执行很多次,至少两次。
所以要避免在filter中执行耗时操作。
可以在controller中预先处理
慎用事件
$broadcast
会遍历scope和它的子scope,而不是只通知注册了该事件的子scope。$emit
, 参见Provide $scope.$onRootScope method angular/angular.js#4574directive
以DOM为中心
的思维,拥抱以数据为中心
的思维。参见使用Batarang来分析性能
The text was updated successfully, but these errors were encountered: