StrictMode
StrictMode 如何发现依赖单次执行的代码?
- 开发检查: 在其覆盖的子树中额外执行某些本应纯粹的函数,使修改外部数据等问题更容易出现;
- 检查对象: 包括组件函数体、state 初始化与更新函数、reducer 和 memo 计算,不会因此重复调用点击处理器;
- 生产行为: 这些额外检查不在生产构建运行,不能把开发日志次数当作生产调用保证;
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
createRoot(document.getElementById("root")).render(
<StrictMode>
<App />
</StrictMode>,
);
重跑 Effect 为什么能暴露资源泄漏?
- 对称检查: 开发中额外执行 setup → cleanup → setup,检查连接、监听和计时器是否能完整释放并重建;
- 修复方向: 补齐清理,使重来之后仍只有一份有效资源,不使用“已运行”ref 跳过第二次建立;
- 局部边界: 如果 StrictMode 没有位于应用根部,初次挂载不会启用那些可能造成父子 Effect 顺序不符合生产行为的额外检查;
回调 ref 为什么也需要正确清理?
- 回调重跑: 开发检查会额外设置与清理回调 ref,暴露列表节点集合只加不删等问题;
- 实例对应: 注册一个节点就应有对应的解除操作,React 19 可从回调 ref 返回清理函数;
- 验证方法: 反复显示、隐藏与重排列表后,节点集合不应持续增长或残留已卸载节点;