Angular 18 于 2024 年 5 月 22 日发布,引入了一个实验性的游戏规则改变者:无区域 Angular 应用程序。 这消除了对 Zone.js 的依赖,提高了性能,减少了开销,并简化了调试。让我们深入研究无区域应用程序、它们的优点以及如何尝试此功能。
更改检测使 DOM 与组件数据保持同步。 以前,Angular 依赖 Zone.js。 通过以下方式触发更改检测:
setTimeout
、setInterval
、Promise 解析。ApplicationRef.tick()
、ChangeDetectorRef.detectChanges()
.Zone.js 修补了浏览器 API,通知 Angular 启动更改检测。 虽然有效,但这增加了开销,有时会导致ExpressionChangedAfterItHasBeenCheckedError
。
在无区域更改检测之前,Zone.js 管理 UI 更新。这个 StackBlitz 示例说明:
ChangeDetectionStrategy.OnPush
,直接数组突变可能不会更新视图,除非手动触发引用更改或更改检测。AsyncPipe
简化可观察处理,自动订阅并触发更改检测。这些示例突出了 Zone.js 在变更检测中的作用,为 Angular 改进的无区域架构奠定了基础。
删除 Zone.js 具有显着的好处:
ExpressionChangedAfterItHasBeenCheckedError
问题和与区域相关的复杂性。切换到无区需要更改配置:
app.config.ts
中,添加:<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
删除provideZoneChangeDetection()
(如果存在)。
import '*zone.js';
。angular.json
中,从 zone.js
数组中删除 polyfills
:<code class="language-json">"polyfills": []</code>
<code class="language-bash">npm uninstall zone.js</code>
此示例演示了没有 Zone.js 的更改检测:
让我们分析一下每个场景:
按预期工作。
需要this.changeDetectorRef.markForCheck();
或使用信号:
更正版本(带有markForCheck
):
更正版本(带信号):
视图不会自动更新:
更正版本(带有markForCheck
):
优先使用async
管道。
简单;使用 async
管道:
使用 toSignal()
将可观察量转换为信号:
摘要:
markForCheck()
或信号。async
管道。Angular 19 进一步完善了无区应用程序支持、改进了 API、添加了服务器端渲染支持并增强了测试。 Angular CLI 现在支持创建无区域项目:
<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
以上是在 Angular 中拥抱 Zoneless:变化检测的新时代的详细内容。更多信息请关注PHP中文网其他相关文章!