本文档解释了 Svelte 组件从初始化到销毁的生命周期,以及响应性如何与生命周期集成。有关响应性系统本身的信息,请参阅 响应性系统。
在 Svelte 中,组件在其生命周期中会经历几个阶段
自 Svelte 5 起,组件生命周期主要通过 effect 系统进行管理,该系统通过细粒度的响应性处理初始渲染和后续更新。
来源:packages/svelte/src/internal/client/render.js72-265 packages/svelte/src/internal/client/reactivity/effects.js43-618 packages/svelte/src/internal/client/runtime.js44-865
组件通过 `mount()` 函数创建和挂载,或通过 `hydrate()` 函数水合(附加到服务器渲染的 DOM)。两者最终都会调用内部的 `_mount()` 函数。
来源:packages/svelte/src/internal/client/render.js72-265 packages/svelte/src/internal/client/reactivity/effects.js229-266
组件函数返回一个组件实例对象,其中包含组件的任何导出值,这允许与组件进行编程交互。
来源:packages/svelte/src/internal/client/render.js168-265 packages/svelte/src/internal/client/reactivity/effects.js243-258
组件由管理其生命周期和响应性的 effect 层次结构提供支持
来源:packages/svelte/src/internal/client/reactivity/effects.js44-618 packages/svelte/src/internal/client/constants.js1-32
Svelte 中的每个 effect 都有一个特定的创建过程和执行模式,构成了组件响应性的骨干
来源:packages/svelte/src/internal/client/reactivity/effects.js83-151 packages/svelte/src/internal/client/runtime.js160-497 packages/svelte/src/internal/client/runtime.js560-624
当组件状态发生变化时,更新周期会管理 effect 的调度和执行方式
更新周期发生在
更新可以通过 `flushSync()` 同步强制执行,或者在下一个微任务后使用 `tick()` 执行。
来源:packages/svelte/src/internal/client/runtime.js743-865 packages/svelte/src/internal/client/reactivity/sources.js129-221
当组件不再需要时,调用 `unmount()` 来清理资源
销毁过程
来源:packages/svelte/src/internal/client/render.js293-306 packages/svelte/src/internal/client/reactivity/effects.js426-480 packages/svelte/src/internal/client/reactivity/effects.js509-537
每个组件都有一个上下文对象来维护其状态
| 属性 | 描述 |
|---|---|
p | 父上下文引用 |
c | 上下文值映射 |
d | 已销毁标志 |
e | 延迟 effect 数组 |
m | 已挂载标志 |
s | Props (传统) |
x | Exports (传统) |
l | 传统生命周期属性 |
上下文尤其重要,用于
来源:packages/svelte/src/internal/client/types.d.ts12-66 packages/svelte/src/internal/client/reactivity/effects.js176-203
Svelte 5 使用 runes 进行生命周期管理,但保持与旧方法的兼容性
在这两种模式下,生命周期管理都通过 effect 系统进行,但使用了不同的 API。传统模式使用一组显式的生命周期函数,这些函数在编译期间转换为 effect。
来源: packages/svelte/src/internal/client/reactivity/effects.js175-218 packages/svelte/src/internal/client/reactivity/effects.js277-318 packages/svelte/src/internal/client/dom/legacy/lifecycle.js
在服务器端渲染和随后的客户端水合过程中,组件遵循特殊的生命周期路径
水合过程
来源: packages/svelte/src/internal/client/render.js99-157 packages/svelte/src/internal/server/index.js62-113
特殊组件块(if、each、await 等)有自己的生命周期管理
If 块创建分支效果,这些效果根据条件暂停/恢复
Each 块有一个复杂的生命周期,包括
Await 块处理具有三种可能状态的 Promise
这些块中的每一个都会创建适当的效果来管理其生命周期,并确保在组件被销毁时进行正确的清理。
来源: packages/svelte/src/internal/client/dom/blocks/if.js packages/svelte/src/internal/client/dom/blocks/each.js42-609 packages/svelte/src/internal/client/dom/blocks/await.js
在 Svelte 5 中,组件实现了所有权验证,以帮助防止常见错误
所有权验证系统确保
此系统有助于创建可预测的数据流并防止意外的副作用。
来源: packages/svelte/src/internal/client/dev/ownership.js10-66 packages/svelte/src/internal/client/proxy.js17-321
这些模式利用组件生命周期和效果系统来确保正确的资源管理和清理。
来源: packages/svelte/src/internal/client/reactivity/effects.js175-218 packages/svelte/tests/signals/test.ts54-490
组件可以充当错误边界,以捕获和处理其子组件中的错误
带有过渡的组件具有特殊的销毁过程
在 SSR 期间
onDestroy 回调在渲染后立即执行来源: packages/svelte/src/internal/client/runtime.js234-358 packages/svelte/src/internal/client/reactivity/effects.js509-537 packages/svelte/src/internal/server/index.js58-113