Svelte 5 不是纯编译魔法:Runes、信号与直接改 DOM 到底怎么跑
来源:dev.to — 2026-11-04
📋 概述
Svelte 早年靠编译器改写在赋值处注入 $$invalidate,把组件标脏后统一重跑更新函数。这套做法的裂缝在应用变大后暴露:响应式只在 .svelte 文件内有效,业务逻辑挪到普通 JS 就失效;深改对象还得 user = user 重新赋值,让整个组件重算。Svelte 5 转向 Runes 与推拉式运行时信号图,很多人以为它放弃了编译器优势,作者认为恰恰相反——编译器负责静态分析、模板提升与响应式空洞定位,运行时信号负责跨模块依赖跟踪与深对象变更,两者配合才做到无虚拟 DOM 的细粒度更新,而 $state.raw 是追求极限性能时的开关。
🔑 核心要点
- Svelte 3/4 在赋值处注入 $$invalidate,用位掩码标脏再重跑更新函数,响应式的原子边界是整个组件。
- 核心缺陷是响应式越不出 .svelte 文件:逻辑挪进普通 JS 就只能退回 writable store 加手动订阅。
- 深改对象必须重新赋值根对象才能触发更新,代价是整个组件重新走一遍脏检查。
- Svelte 5 的分工是编译器管静态(模板提升、响应式空洞),运行时信号管动态(跨模块依赖、深变更),不需要虚拟 DOM 也能精确更新。
💡 金句
“It is the realization that the compiler and the runtime signal graph are strongest when working in harmony.”
译:这是一种认识:编译器和运行时信号图只有在协同工作时才最强。
👍 0
👎 0
← 返回 dev.to 首页