dev.to | 📄 原文链接 | 2026-10-15 收录

Zone.js 劫持了你的浏览器八年,替换它的是什么

来源:dev.to — 2026-10-14

📋 概述

这篇讲 Angular 从 Zone.js 转向 Signals 与无 Zone 变更检测的架构改造。每个前端框架都要回答同一个问题:内存里的数据变了,框架怎么知道哪些像素要更新。React 选了虚拟 DOM 差异比对,Svelte 选编译期 DOM 改写,而近十年来 Angular 的答案最奇怪:它劫持了整个浏览器——你调用 setTimeout、点击按钮、发网络请求,都会被拦下。做这件事的 Zone.js 并不真的知道哪个数据变了、属于哪个组件,它只知道某个异步浏览器 API 跑完了,于是 Angular 只能从根组件开始自上而下遍历整棵组件树,逐个检查每个绑定。新一代 Angular 拆掉猴子补丁与全树扫描,改用 Signals:改动直接把对应模板视图标脏,调度器合并更新,在微任务里只访问这一个组件并直接改写插值文本节点。文章还列出迁移时的三个坑:在类属性上直接赋值在无 Zone 下不会再触发更新,要用 signal;effect 会订阅回调里读到的每一个信号,次要信号要用 untracked 包住;手动订阅 Observable 而不写回 Signal 时视图不会刷新,要用 toSignal 把 RxJS 桥接进响应式图。

🔑 核心要点

💡 金句

令人意外的答案是:它根本不知道。Angular 完全不知道 count 被改过。
← 返回 dev.to 首页