”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 变化检测从 Angular zone.js) 到 Angular (provideExperimentalZonelessChangeDetection) 的演变

变化检测从 Angular zone.js) 到 Angular (provideExperimentalZonelessChangeDetection) 的演变

发布于2024-11-08
浏览:984

The Evolution of Change Detection from Angular zone.js) to Angular (provideExperimentalZonelessChangeDetection)

更改检测是 Angular 的一个基本方面,负责识别和更新 DOM 中因数据修改或用户交互而发生更改的部分。此过程可确保 UI 与底层数据保持一致,从而增强用户体验和应用程序性能。

Zone.js 的作用

从历史上看,Angular 一直依赖 Zone.js 来实现其变更检测机制。 Zone.js 是一个拦截异步操作的 JavaScript 库,允许 Angular 监视更改并相应地触发更新。但是,包含 Zone.js 可能会增加应用程序的开销,特别是在异步活动频繁的场景中。

变更检测策略

Angular 提供了两种主要的变化检测策略:

  • 默认: 在每个生命周期钩子之后触发更改检测,例如 ngOnInit 或 ngAfterViewInit。这种策略很简单,但可能会导致不必要的 DOM 更新,尤其是在大型应用程序中。
@Component({
  selector: 'app-my-component',
  template: `
    

{{ message }}

` }) export class MyComponent { message = 'Hello, world!'; }

这种策略更容易实现,因为 Angular 会自动处理大部分变化检测逻辑。
这种变更检测策略的最大挑战是它会导致不必要的 DOM 更新,这对于大型应用程序至关重要。

  • OnPush: 仅当输入属性或异步可观察值更改时才会触发更改检测。此策略对于数据更新频繁的复杂组件性能更高,但需要更多的手动管理。
@Component({
  selector: 'app-my-component',
  template: `
    

{{ message }}

`, changeDetection: ChangeDetectionStrategy.OnPush }) export class MyComponent { message = 'Hello, world!'; }

虽然 onPush 变更检测策略最大限度地减少了不必要的 DOM 操作,但 onPush 变更策略的最大挑战是开发人员必须进行更多的手动管理并手动触发变更。在某些情况下,例如当数据间接更改或使用可变对象时,他们必须使用changeDetectorRef.detectChanges()显式处理更改检测。

Angular 18 和混合变化检测:无区域方法

为了解决与 Zone.js 相关的挑战,Angular 18 引入了一项称为混合变更检测的实验性功能。这种方法旨在完全消除 Zone.js,使用新的更改检测机制来检测更改并操作 DOM。

启用混合变更检测:

要启用混合更改检测,可以使用以下代码:

bootstrapApplication(RootCmp,
{ providers: [provideExperimentalZonelessChangeDetection()] 
}
);

这将在以下场景中触发更改检测:

  • 信号已更新。
  • changeDetectorRef.markForCheck() 被调用。
  • 使用 AsyncPipe 订阅的可观察对象收到新值。
  • 组件被附加或分离。
  • 已设置输入。

启用混合更改检测后,您可以安全地从应用程序的 polyfill 中删除 Zone.js。

 "polyfills": [
              "zone.js" //remove this line
            ],

混合变化检测的好处

  • 提高性能:消除 Zone.js 可以减少开销,从而提高性能,特别是在具有大量异步操作的应用程序中。

  • 增强的开发人员体验:取消手动更改检测简化了开发并降低了出错的可能性。

  • 较小的应用程序大小: Zone.js 通常会增加大约 13KB 的应用程序大小。删除它可能会导致捆绑包变小。

版本声明 本文转载于:https://dev.to/this-is-angular/the-evolution-of-change-detection-from-angular-2-zonejs-to-angular-18-provideexperimentalzonelesschangedetection-4f77?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • x86 汇编中的“锁定”指令是否无限期地保留总线?
    x86 汇编中的“锁定”指令是否无限期地保留总线?
    理解x86汇编中的“Lock”指令x86汇编中的“lock”指令是一个前缀,它强制后续指令对总线的独占所有权。这可确保 CPU 在该指令的持续时间内完全控制高速缓存行。停用总线锁定与通常的理解相反,“lock”前缀不会导致 CPU 锁定无限期的公交车。执行后续指令后,锁会被释放。这允许 CPU 仅在...
    编程 发布于2024-11-08
  • Top itemmap Scraper 你应该知道的 4
    Top itemmap Scraper 你应该知道的 4
    有时需要组织并包含在新网站设计中的信息量可能会令人难以承受,从而使任务变得更加困难。站点地图是一个有用的规划工具,可以帮助组织和简化网站上需要的材料并删除任何不需要的页面。此外,精心设计的站点地图可为访问者提供积极的体验,从而提高转化率。 多年来,最好的网页设计方法一直包括站点地图;因此,它们并不是...
    编程 发布于2024-11-08
  • 如何在 Web 浏览器中跟踪 XMLHttpRequest 的进度更新?
    如何在 Web 浏览器中跟踪 XMLHttpRequest 的进度更新?
    获取 XMLHttpRequest 的进度更新Web 浏览器为客户端-服务器数据交换提供 XMLHttpRequest (XHR) 对象。虽然标准 XHR API 缺乏固有的进度跟踪功能,但有一些方法可以监控数据传输的进度。上传字节数:XHR 公开 xhr.upload。 onprogress 事件...
    编程 发布于2024-11-08
  • 如何在 JavaScript 中向回调函数传递参数?
    如何在 JavaScript 中向回调函数传递参数?
    在 JavaScript 中向回调函数传递参数在 JavaScript 中,回调函数通常用于在某个事件发生后执行特定任务。在定义这些函数时,通常需要向它们传递相关数据或参数。传递参数的一种简单方法是在调用回调函数时将它们显式设置为实参。例如:function tryMe(param1, param2...
    编程 发布于2024-11-08
  • 与 Jira 和 LLM 的互动项目报告
    与 Jira 和 LLM 的互动项目报告
    For all projects I worked on, I used some sort of project management system where project scope was defined as a list of tasks (tickets), and progress...
    编程 发布于2024-11-08
  • 如何在 PHP 中对不同格式的日期数组进行排序?
    如何在 PHP 中对不同格式的日期数组进行排序?
    PHP 日期数组排序在 PHP 中对日期数组进行排序可能很棘手,特别是当日期不是标准化格式时。In根据您的具体情况,您有不同格式的日期数组,例如“11-01-2012”和“01-01-2014”。使用 asort 函数(按升序对数组进行排序)在这种情况下不起作用,因为它将每个日期视为字符串并忽略年-...
    编程 发布于2024-11-08
  • 机器学习中的 C++:逃离 Python 和 GIL
    机器学习中的 C++:逃离 Python 和 GIL
    介绍 当 Python 的全局解释器锁 (GIL) 成为需要高并发或原始性能的机器学习应用程序的瓶颈时,C 提供了一个引人注目的替代方案。这篇博文探讨了如何利用 C 语言进行 ML,重点关注性能、并发性以及与 Python 的集成。 阅读完整的博客! ...
    编程 发布于2024-11-08
  • 如何在 PHP 中将 UTF-8 字符转换为 ISO-8859-1 并返回?
    如何在 PHP 中将 UTF-8 字符转换为 ISO-8859-1 并返回?
    将 UTF-8 字符转换为 ISO-88591 并返回 PHP当使用使用不同编码的多个脚本时,需要在字符集之间进行转换。其中一种转换涉及将 UTF-8 字符转换为 ISO-88591,反之亦然。尽管存在 utf_encode() 和 _decode(),但将 UTF-8 直接转换为 ISO-8859...
    编程 发布于2024-11-08
  • 以下是一些标题选项,使用问题格式,重点关注文章中提出的挑战和解决方案:

选项 1(直接且简洁):
* 如何避免 Angul 中的模板标签冲突
    以下是一些标题选项,使用问题格式,重点关注文章中提出的挑战和解决方案: 选项 1(直接且简洁): * 如何避免 Angul 中的模板标签冲突
    为 AngularJS 和 Django 定制模板标签由于模板标签冲突,将 AngularJS 与 Django 集成可能会带来挑战,两者都使用{{}}。为了克服这个问题,需要调整 AngularJS 或 Django 的模板标签语法。AngularJS 模板标签定制:在 AngularJS 1.0...
    编程 发布于2024-11-08
  • 每个开发人员都应该了解的高级 JavaScript 概念
    每个开发人员都应该了解的高级 JavaScript 概念
    JavaScript 是许多开发人员日常使用的语言,但其生态系统中存在许多隐藏的瑰宝,即使是经验丰富的开发人员也可能不熟悉。本文探讨了一些鲜为人知的 JavaScript 概念,它们可以显着提高您的编程技能。我们将介绍 代理、符号、生成器等概念,通过示例演示每个概念并解决问题以说明其强大功能。 最...
    编程 发布于2024-11-08
  • 直接用mysqli_函数替换mysql_函数会带来挑战吗?
    直接用mysqli_函数替换mysql_函数会带来挑战吗?
    盲目用 mysqli_ 替换 mysql_ 函数会导致问题吗?将代码库更新到 PHP 7 需要将已弃用的 mysql_ 函数替换为 mysqli_ 对应函数。然而,一个常见的误解是您可以直接进行全面替换。答案:不,事情没那么简单虽然函数名称可能会出现类似地,与 mysql_ 相比,mysqli_ 函...
    编程 发布于2024-11-08
  • 为什么 `malloc()` 在 C++ 中会导致“无效转换”错误?
    为什么 `malloc()` 在 C++ 中会导致“无效转换”错误?
    Malloc 分配问题:了解“无效转换”错误提供的代码在尝试使用 malloc 分配内存时引入了一个常见问题( )。该错误源于将 malloc() 的返回值直接分配给 char 指针而没有进行正确的转换。malloc() 函数在堆中保留一块内存并返回一个通用的 void 指针。但是,代码将此指针分配...
    编程 发布于2024-11-08
  • 如何在 Zend Framework 中确定客户端的时区?
    如何在 Zend Framework 中确定客户端的时区?
    客户端时区确定确定客户端时区对于时间敏感的应用程序至关重要。这个问题探讨了如何在 Zend Framework 中获取此信息。以秒偏移量形式检索时区获取时区的首选方法是作为距 UTC 的秒数。例如,俄罗斯莫斯科将返回 36060,而英国伦敦将返回 0。建议的解决方案建议的解决方案涉及利用jQuery...
    编程 发布于2024-11-08
  • 如何使用 React 构建通知功能
    如何使用 React 构建通知功能
    Hello everyone ?? In today's tutorial, we'll guide you through building a real-time notifications feature using SuperViz, a powerful platform for rea...
    编程 发布于2024-11-08
  • 了解命令式编程和声明式编程之间的区别
    了解命令式编程和声明式编程之间的区别
    当我刚开始学习React时,我的老师说:“JavaScript是命令式编程,而React是声明式编程。”然而,一开始这对我来说不太有意义。因此,我决定将其分解以更好地理解其中的区别。 将命令式和声明式编程与披萨进行比较? 为了更容易理解,让我们比较一下这两种烹饪方法。 ...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3