Angular CD Part2
这篇我们再次聊聊 Angular 的 CD
Zone vs ngZone
- zone.js, 它是 js 异步执行的上下文。凡事通过
zone.run(func)
,都是在 zone 的上下文中。
zone.js, 它通过封装了一些常见的异步操作的方法,例如 setTimeout/xhr/promise/onxxxlist,我们一旦嵌入 zone.js 到我们的代码中,凡是调用如上异步的方法,其实调用的都是 zone 封装的这些方法,从而达到对这些方法进行接管,类似于后端里面的 AOP, 推荐两个链接了解 zone link1, link2 - ngZone, Angular 是继承于 zone.js,同时提供了实现的三个 HookAPI, 那么 Angular 是如何激发 CD,其实它在
onTurnDone()
这个 HookAPI 里面做的。- onTurnStart()
- onTurnDone() 当异步事件执行结束,同时所有的 MicroTask 执行结束后,emit 这个事件。
- onEventDone()
这里提供一个简单的代码
class ApplicationRef {
changeDetectorRefs:ChangeDetectorRef[] = [];
constructor(private zone: NgZone) {
this.zone.onTurnDone
.subscribe(() => this.zone.run(() => this.tick());
}
tick() {
this.changeDetectorRefs
.forEach((ref) => ref.detectChanges());
}
}
总结一下,也就是说,Angular 通过 ngZone,以及继承来的 zone,对于所有的异步操作,例如,setTimeout/Promise/onxxx/xhr, 都会有感知,然后,在这些异步方法执行结束后,在onTurnDone()
钩子里面激发整个 VDomTree 做更新检测。
- 那么同样的对于mousemove这种事件,很容易造成性能问题,ngZone提供了两种方式,来规避这个问题
ngZone.runOutofAngularZone(func)
,ngZone.run(func)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构