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

工作原理

具体参考

playground

  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了吗,遇到哪些坑欢迎评论区留言。