迁移一个拥有五年历史的 YMS:从 Angular 16 到 21(第六部分)——无区域 Angular:zone.js 的终结与真正的性能

发布日期:2026-06-04 10:03:24   浏览量 :0
发布日期:2026-06-04 10:03:24  
0

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

大家好,开发者社区!👋

如果你关注了上一篇关于我们企业项目中引入信号(Signals)的文章,你应该已经注意到角框架(Angular)的响应式机制变得更加“智能”了。但要理解我们在升级到角框架 21(Angular 21)后获得的巨大性能提升,我们需要谈谈房间里的大象:zone.js

1. 什么是 zone.js,为什么它成了一个问题?

从角框架 2(Angular 2)开始,该框架使用一个名为 zone.js 的库来知晓何时更新屏幕。zone.js 充当一个“间谍”。它会拦截用户浏览器中发生的绝对所有事情:按钮点击、setTimeout、超文本传输协议调用(fetch/XHR)。

每当这些事件之一结束时,zone.js 就会向角框架大喊:“嘿!发生了一些事情。检查整个组件树,看看是否有任何变量发生了变化!”

性能瓶颈:在小型系统中,扫描整个屏幕是察觉不到的。但在一个拥有 5 年历史、显示数千行网格和沉重的 PrimeNG 组件的堆场管理系统(YMS)中,这种持续的检查(变更检测周期)对中央处理器(CPU)的消耗非常大。一个简单的在后台运行的 setInterval 就可能导致整个界面出现轻微的卡顿。

2. 稳定的未来:无区域角框架(Zoneless Angular)

随着信号(Signals)的到来,角框架现在确切地知道哪个变量发生了变化,以及哪块最小的超文本标记语言(HTML)部分需要重新绘制。它不再需要依赖那个大喊着要检查整个系统的间谍(zone.js)。

在角框架 21(Angular 21)中,这种方法已达到成熟阶段。应用程序接口(API)不再是实验性的,而是变得完全稳定。现在,启用无区域(Zoneless)应用已成为推荐的标准做法,且极其简单。我们仅更改了启动文件(main.ts):

// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { provideZonelessChangeDetection } from '@angular/core';

bootstrapApplication(AppComponent, {
  providers: [
    provideZonelessChangeDetection(), // 官方且稳定的魔法在此发生!
    // ... 其他路由和超文本传输协议提供者
  ]
});

3. 对项目的影响

关闭 zone.js 立即减轻了我们 JavaScript 包的初始重量(浏览器需要下载的数据减少了约 100KB)。但主要的受益体现在用户体验(UX)上。

与动态数据表、模态框和复杂过滤器的交互现在能够稳定地以每秒 60 的速度运行,而浏览器的主线程不会因为每次点击时数十次不必要的检查而被阻塞。

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 订阅 数据