返回文章列表

React Compiler 能用了吗,原理是什么

React 的设计思路很简单。就是

const ui = f(state)

但在复杂的现实世界,想要理想化地实践函数式编程要考虑的东西太多了。

状态来源千奇百怪,状态的变化也总出乎意料。

React 不得不搞出一大堆的 API,试图解决各种边界情况。但 API 越来越多,心智负担也越来越重,随后 React 团队提出了 React Compiler,旨在编译时自动优化,尽可能减少心智负担。

显然这也是为以后新特性铺路,有了 React Compiler,相当于在编译时有了更多操作空间(比如组件声明 Props 类型就自动解构),以后可以在这里搞更多的新功能。

那现在 React Compiler 能用了吗?

能用。而且不只是 React 19 能用,React 18/17 都能用。

老项目迁移

老项目能不能直接用,取决于代码写得合不合乎规范。合乎规范就能用,Meta 已经在生产环境上用了很长时间了。

可以借着 ESLint 来检查代码,不报错就问题不大。我知道老项目里有很多屎山,大家堆屎的时候喜欢直接禁用 ESLint。像这种可疑的地方可以显式声明 "use no memo",跳过 React Compiler。

如果还嫌有风险的话,可以在项目里创建一个新目录:src/modern,指定只有这里用 React Compiler。

如果不方便创建新目录,那可以开启“注释”模式,只有显式声明 "use memo" 的组件才会被 React 编译器优化。

总之,还是看个人,如果你觉得天天写 useMemo/useCallback,心智负担太重了那就赶紧上 React Compiler 吧。

具体配置方法可以查阅文档:https://zh-hans.react.dev/learn/react-compiler/incremental-adoption

工作原理

具体参考

  1. 创建数组 $,静态分析该组件需要几个缓存槽位。

  2. 把依赖项和模板都存到数组里,如果没依赖项就用 sentinel Symbol 替代。

  3. 在组件重新渲染时作判断,依赖项发生改变了就重存一遍依赖项和模板,并返回模板,依赖项没变就直接返回缓存的模板。

  4. 无需 useMemo,仅条件判断即可。

注意项

目前不开启 React Compiler 的一个主要障碍是一些项目为了更快的编译速度使用 SWC 替代了 Babel。而 React Compiler 目前是以 Babel 插件的形式存在的,所以想在 SWC 项目中使用 Babel 可能会比较麻烦。

另外,并不是永远不用 useCallback/useMemo 了,useEffect 的 deps 数组、第三方库的 config 对象仍建议保留手动 memo。

2026 年你的项目用上 React Compiler 了吗,遇到哪些坑欢迎评论区留言。