• 技术文章 >web前端 >js教程

    浅析Angular变更检测机制,聊聊如何进行性能优化?

    青灯夜游青灯夜游2022-05-11 14:11:32转载113
    什么是变更检测?下面本篇文章带大家了解一下Angular中的变更检测机制,聊聊变更检测是如何工作的,并介绍一下Angular变更检测的性能优化方法,希望对大家有所帮助!

    什么是变更检测(Change Detection)?

    变更检测的概念

    组件内的数据状态变化以后,需要对应更新视图。这种将视图和数据同步的机制,就叫变化检测。【相关教程推荐:《angular教程》】

    变更检测的触发时机

    只要发生了异步操作(Events, Timer, XHR),Angular 就会认为有状态可能发生变化了,然后就会进行变更检测。

    既然都是对异步操作进行变更检测,那么Angular是如何订阅异步请求,进行变更检测的呢?

    这里介绍下NgZone以及它的fork对象Zone.js

    Zone.js 用于封装和拦截浏览器中的异步活动、它还提供 异步生命周期的钩子统一的异步错误处理机制。

    Zone.js 是通过 Monkey Patching(猴子补丁) 的方式来对浏览器中的常见方法和元素进行拦截,例如 setTimeoutHTMLElement.prototype.onclick。Angular 在启动时会利用 Zone.js 修补几个低级浏览器 API,从而实现异步事件的捕获,并在捕获时间后调用变更检测。

    Angular通过forkZone.js并拓展出一个自己的区域NgZone,让应用中的所有异步操作都会运行在这个区域中。

    Angular的变更检测如何工作的?

    Angualr会为每一个组件生成一个变化监测器changeDetector ,记录组件的变化状态。

    我们在创建了一个Angular 应用后,Angular 会同时创建一个 ApplicationRef 的实例,这个实例代表的就是我们当前创建的这个 Angular 应用的实例。 ApplicationRef 创建的同时,会订阅 ngZone 中的 onMicrotaskEmpty 事件,在所有的微任务完成后调用所有的视图的detectChanges()来执行变更检测。

    变更检测的执行顺序

    举个栗子,我们在开发模式的时候可能会遇到这种报错:

    1.png

    这是由于变更检测遵循从根组件开始,从上到下,执行每个组件的变更检测,直到最后一个组件达到稳定状态。而在下一次变更检测之前,子孙组件都不允许去修改父组件里的属性。

    情况1 在开发模式下,Angular会进行二次检测 (生产环境下调用enableProdMode(),检测次数会降为1)。一旦我们在 第4步 完成后,在子孙组件里修改父组件的属性,那么,Angular在执行第二次检测的时候,发现两次的值不一致,就会出现上述错误。

    情况2 只要父组件对子组件做了属性绑定,那么不管是在OnChanges,OnInit,DoCheck,AfterContentInit 和 AfterViewInit 中的任意一个生命周期钩子中执行下述代码,也会报错。

    // #parent
    {{data}}
    <child [data]="data"></child>
    
    // in child component ts, execute:
    this.parent.data = 'new Value';

    变更检测的执行策略

    对于Angular的变更检测如何优化?

    由于组件默认执行 Default策略 ,任何异步操作都会触发整个组件数从上到下的检查。即使Angular团队不断提升性能,可以在毫秒内完成上百次检测,但是当应用拓展至百上千个组件组成时,庞大的组件树对应的变更检测也会达到性能瓶颈。

    此时,我们就需要开始分析并减少不必要的检测次数。

    如何减少检测次数

    3.png

    4.png

    5.png

    插件:Angular devtool使用介绍

    更多编程相关知识,请访问:编程教学!!

    以上就是浅析Angular变更检测机制,聊聊如何进行性能优化?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:Angular Angular.js
    上一篇:深入浅析Node.js中常见的内置模块 下一篇:聊聊angular中进行内容投影的方法
    千万级数据并发解决方案

    相关文章推荐

    • Angular + NG-ZORRO快速开发一个后台系统• 聊聊Angular中组件之间怎么通信• 一文浅析Angular中的响应式表单• 什么是管道?浅析Angular中的管道(PIPE)• Angular项目如何上线?结合nginx来聊聊上线流程!• Angular知识点分享:聊聊表单、管道、绑定、指令、通信和周期
    1/1

    PHP中文网