Angular4性能优化方法总结

这次给大家带来Angular4性能优化方法总结,Angular4性能优化的注意事项有哪些,下面就是实战案例,一起来看一下。

Summary

Angular 4的脏值检测是个老话题了,而理解这个模型是做Angular性能优化的基础。因此,今天我们再来聊聊Angular 4脏值检测的原理,并看看性能优化的小提示。

进入点 – Zone.js

Angular 4是一个MVVM框架。数据模型(Model)转换成视图模型(ViewModel)后,绑定到视图(View)上渲染成肉眼可见的页面。因此,发现数据模型变化的时间点是更新页面的关键,也是调用脏值检测的关键。

经过分析,工程师们发现,数据的变化往往由macrotask和microtask等异步事件引起。因此,通过重写浏览器所有的异步API,就能从源头有效地监听数据变化。Zone.js就是这样一个猴子脚本(Monkey Patch)。Angular 4使用了一个定制化的Zone(NgZone),它会通知Angular可能有数据变化,需要更新视图中的数据(脏值检测)。

脏值检测(Change Detection)

脏值检测的基本原理是存储旧数值,并在进行检测时,把当前时刻的新值和旧值比对。若相等则没有变化,反之则检测到变化,需要更新视图。

Angular 4把页面切分成若干个Component(组件),组成一棵组件树。进入脏值检测后,从根组件自顶向下进行检测。Angular有两种策略:Default和OnPush。它们配置在组件上,决定脏值检测过程中不同的行为。

Default – 缺省策略

ChangeDetectionStrategy.Default。它还意味着一旦发生可能有数据变化的事件,就总是检测这个组件。

脏值检测的操作基本上可以理解为以下几步。1)更新子组件绑定的properties,2)调用子组件的NgDoCheck和NgOnChanges生命周期钩子(Lifecycle hook),3)更新自己的DOM,4)对子组件脏值检测。这是一个从根组件开始的递归方程。

// This is not Angular codefunction changeDetection(component) { updateProperties(component.children); component.children.forEach(child => {  child.NgDoCheck();  child.NgOnChanges(); }; updateDom(component); component.children.forEach(child => changeDetection(child));}

登录后复制

我们开发者会非常关注DOM更新的顺序,以及调用NgDoCheck和NgOnChanges的顺序。可以发现:

DOM更新是深度优先的

NgDoCheck和NgOnChanges并不是(也不是深度优先)

OnPush – 单次检测策略

ChangeDetectionStrategy.OnPush。只在Input Properties变化(OnPush)时才检测这个组件。因此当Input不变时,它只在初始化时检测,也叫单次检测。它的其他行为和Default保持一致。

需要注意的是,OnPush只检测Input的引用。Input对象的属性变化并不会触发当前组件的脏值检测。

虽然OnPush策略提高了性能,但也是Bug的高发地点。解决方案往往是将Input转化成Immutable的形式,强制Input的引用改变。

Tips

数据绑定

Angular有3种合法的数据绑定方式,但它们的性能是不一样的。

直接绑定数据

  • Name {{item.name}} Classes {{item.classes}}

登录后复制

大多数情况下,这都是性能最好的方式。

绑定一个function调用结果

  • Name {{item.name}} Classes {{classes(item)}}

登录后复制

在每个脏值检测过程中,classes方程都要被调用一遍。设想用户正在滚动页面,多个macrotask产生,每个macrotask都至少进行一次脏值检测。如果没有特殊需求,应尽量避免这种使用方式。

绑定数据+pipe

  • Name {{item.name}} Classes {{item | classPipe}}

登录后复制

它和绑定function类似,每次脏值检测classPipe都会被调用。不过Angular给pipe做了优化,加了缓存,如果item和上次相等,则直接返回结果。

NgFor

多数情况下,NgFor应该伴随trackBy方程使用。否则,每次脏值检测过程中,NgFor会把列表里每一项都执行更新DOM操作。

@Component({ selector: 'my-app', template: `  
  • {{item.id}}
`,})export class App { collection; constructor() { this.collection = [{id: 1}, {id: 2}, {id: 3}]; } getItems() { this.collection = this.getItemsFromServer(); } getItemsFromServer() { return [{id: 1}, {id: 2}, {id: 3}, {id: 4}]; } trackByFn(index, item) { return index; }}

登录后复制

Reference

He who thinks change detection is depth-first and he who thinks it’s breadth-first are both usually right

Angular Runtime Performance Guide

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

vue-cli2.9.3使用步骤详解

vue webpack使用案例详解

以上就是Angular4性能优化方法总结的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2767229.html

(0)
上一篇 2025年3月8日 11:33:08
下一篇 2025年3月8日 11:33:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS做出随机数方法总结

    这次给大家带来JS做出随机数方法总结,JS做出随机数方法的注意事项有哪些,下面就是实战案例,一起来看一下。 var chars = [‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9′,’A’,’B’,’C’,’…

    编程技术 2025年3月8日
    200
  • js实现字符串与数组去重方法

    这次给大家带来js实现字符串与数组去重方法,js实现字符串与数组去重的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了JS实现字符串去重及数组去重的方法。分享给大家供大家参考,具体如下: js数组、字符串去重 /*数组去重*…

    2025年3月8日
    200
  • vue父组件调用子组件方法总结

    这次给大家带来vue父组件调用子组件方法总结,vue父组件调用子组件的注意事项有哪些,下面就是实战案例,一起来看一下。 情景:   父组件中引入上传附件的子组件:点击组件可以分别上传对应要求的图片,子组件内部循环可创建多个模块.   父组件…

    2025年3月8日
    200
  • vue根据参数方法来打包域名方法详解

    这次给大家带来vue根据参数方法来打包域名方法详解,vue根据参数方法来打包域名的注意事项有哪些,下面就是实战案例,一起来看一下。 项目开发中,前端在配置后端api域名时很困扰,常常出现: 本地开发环境: api-dev.demo.com …

    编程技术 2025年3月8日
    200
  • 在Vue中watch方法使用详解

    这次给大家带来在Vue中watch方法使用详解,在Vue中watch方法使用的注意事项有哪些,下面就是实战案例,一起来看一下。 watch本身很容易理解, watch负责将视图中的数据与某个函数关联起来 当Vue视图中的数据变化时, 关联的…

    2025年3月8日
    200
  • vue渲染时闪烁完美解决方法

    这次给大家带来vue渲染时闪烁完美解决方法,处理vue渲染时闪烁的注意事项有哪些,下面就是实战案例,一起来看一下。 v-if和v-show可能是日常开发中最常用的两个指令,虽然看上去两者功能是类似的,但是两者还是存在很大区别的。  v-if…

    编程技术 2025年3月8日
    200
  • 操作render执行有哪些方法

    这次给大家带来操作render执行有哪些方法,操作render执行的注意事项有哪些,下面就是实战案例,一起来看一下。 我们都知道Render在组件实例化和存在期时都会被执行。实例化在componentWillMount执行完成后就会被执行,…

    2025年3月8日
    200
  • JS几种数组遍历方法总结及对比

    这次给大家带来JS几种数组遍历方法总结及对比,JS几种数组遍历方法总结及对比的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历…

    2025年3月8日
    400
  • vue select组件开启与禁用方法详解

    这次给大家带来vue select组件开启与禁用方法详解,vue select组件开启与禁用的注意事项有哪些,下面就是实战案例,一起来看一下。 业务:消息推送方式有两种,为“微信”和“邮件”,微信发送时需要选择“要发送的应用程序”,邮件发送…

    2025年3月8日
    200
  • vue下拉列表实现方法

    这次给大家带来vue下拉列表实现方法,vue下拉列表实现的注意事项有哪些,下面就是实战案例,一起来看一下。 喜欢的请反手来个star,有issue的欢迎提出 安装 cnpm install vue-droplist –save 登录后复制…

    2025年3月8日
    200

发表回复

登录后才能评论