Skip to content

useInsertionEffect 源码深度解析

世界观:CSS-in-JS 的性能守护者

在 React 18 的 Hook 家族中,useInsertionEffect 是一个专门为 CSS-in-JS 库设计的特殊成员。它的存在解决了一个长期困扰 CSS-in-JS 库的性能问题:在何时以及如何高效地向 DOM 中注入样式。

核心概念与设计理念

React 18 新增的必要性

useInsertionEffect 是 React 18 专门为解决 CSS-in-JS 库性能问题而引入的新 Hook。在 React 18 的并发渲染模式下,传统的样式注入方式会导致严重的性能问题。

传统方式的问题:

  • 在渲染过程中注入样式会导致浏览器在每一帧都重新计算样式
  • useLayoutEffect 中注入样式会导致布局被多次计算
  • 样式注入时机不当会导致读取到错误的布局信息

设计目标

核心设计原则

1. 最早执行时机

useInsertionEffect 在所有 DOM 变更完成后、任何布局读取之前执行,确保样式在布局计算前就位。

2. 同步执行保证

useLayoutEffect 类似,useInsertionEffect 同步执行,但执行时机更早,专门用于样式注入。

3. 功能限制

为了保证性能和安全性,useInsertionEffect 有严格的限制:

  • 不能访问 refs
  • 不能调度状态更新
  • 主要用于全局 DOM 节点的插入

4. 交错执行模式

与其他 Effect 不同,useInsertionEffect 采用交错执行模式:先执行清理函数,再执行设置函数,一个组件一个组件地处理。


📲 扫码关注

微信公众号

公众号:前端小卒

专注于前端技术的深度剖析,带你从源码层面理解 React、Vue 等主流框架的设计思想和实现原理。每周更新,干货满满!


本文为预览版本,完整内容请关注公众号获取。