<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ReactCompiler | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《React 编译器到底做了什么》</title><link>https://channel.meo-ai.com/posts/717</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/717</guid><pubDate>Sat, 10 Oct 2026 23:31:54 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《React 编译器到底做了什么》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;br /&gt;&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B&quot; title=&quot;#前端工程&quot;&gt;#前端工程&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BC%96%E8%AF%91%E5%99%A8%E4%BC%98%E5%8C%96&quot; title=&quot;#编译器优化&quot;&gt;#编译器优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ReactCompiler&quot; title=&quot;#ReactCompiler&quot;&gt;#ReactCompiler&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BB%84%E4%BB%B6%E5%86%85%E8%81%94&quot; title=&quot;#组件内联&quot;&gt;#组件内联&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%BB%86%E7%B2%92%E5%BA%A6%E6%9B%B4%E6%96%B0&quot; title=&quot;#细粒度更新&quot;&gt;#细粒度更新&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%8A%B6%E6%80%81%E9%80%89%E6%8B%A9%E5%99%A8&quot; title=&quot;#状态选择器&quot;&gt;#状态选择器&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95&quot; title=&quot;#性能基准测试&quot;&gt;#性能基准测试&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;作者 Jimmy Miller 通过&quot;边做边讲&quot;的方式拆解 React Compiler 的工作原理：它把组件代码转成基于 memo cache 槽位的低级形式，绕开 Hooks 规则限制自动做记忆化。在此之上，他手工原型化了一系列激进优化（组件内联、Block DOM、列表缓存、Context 选择器、外部 store 选择器等），在 13 项微基准测试中最高取得 51 倍加速，但强调这些都只是探索性原型，不代表 React 官方应该采纳。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. React Compiler 的输出特征是把 JSX 构造包进 &lt;code&gt;_c()&lt;/code&gt; 缓存槽位中，首次渲染写入缓存，后续渲染直接复用，本质上相当于给所有内容自动套上了 memo。&lt;br /&gt;2. 编译产物用的是比 Hooks 更底层的 API，可以在条件返回之后做缓存，绕开&quot;useMemo 不能写在条件分支后&quot;这类 Hooks 规则的限制，作者认为这个啰嗦的形式正是理想的编译目标。&lt;br /&gt;3. 编译器内部先把代码转成 SSA（静态单赋值）形式，再跑大量 pass：有的简化代码（如把 &lt;code&gt;props.method()&lt;/code&gt; 拆成属性加载 + 普通调用），有的推断信息，有的做变换优化。&lt;br /&gt;4. 作者尝试组件内联，结果反而更慢（1038 ms 对比编译器的 444 ms），因为内联破坏了 Row 组件自带的缓存边界；说明内联本身只是为后续优化铺路的前置步骤。&lt;br /&gt;5. 借鉴 Million.js 的思路实现 Block DOM（静态/动态分离、按状态 diff 而非树 diff）后，追加 2000 行从 1038 ms 降到 164 ms，内联反而开始带来收益，因为静态边界变得更大了。&lt;br /&gt;6. 列表选择优化借鉴 Solid 的 createSelector：记录选中值变化只影响&quot;旧选中行&quot;和&quot;新选中行&quot;，200 次选择从 250 ms 降到 5.4 ms；Context 细分选择器把 typing 更新场景从 80 ms 降到 11.7 ms。&lt;br /&gt;7. 对 Zustand 这类外部 store，把 &lt;code&gt;===&lt;/code&gt; 判断挪进 selector 内部这一小改动就能带来数倍提升，编译器完全可以自动完成这类分析（200 次选择从 311.5 ms 降到 48.9 ms）。&lt;br /&gt;8. 作者反复强调：微基准测试的胜利不等于生产环境该采纳，真正的难点不在原型而在验证——理解真实负载、权衡内存代价、与生态和未来规划对齐；此外 SSR、hydration 等方向尚未触及。&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://jimmyhmiller.com/what-does-the-react-compiler-even-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://jimmyhmiller.com/what-does-the-react-compiler-even-do&quot;&gt;https://jimmyhmiller.com/what-does-the-react-compiler-even-do&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://jimmyhmiller.com/what-does-the-react-compiler-even-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;I prototyped a number of optimizations as a way to learn more about the React Compiler and got some significant improvements.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;Jimmy Miller&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;Can we Make React Faster using the React Compiler?&quot; src=&quot;/static/https://cdn4.telesco.pe/file/VtG4fjW8_tR8xSRruII4zzwYrURXanHcSZS7lPZ2HWfGzS9X-S_tpuH2qMiK0Wqy5TBwRi1LEykCKwKY_zB7s9tg6XWS1Htt6q9mXN-XrP2tIns7j6VTTuYW6hTFyEQJUAb7oHTCR3R8cWehjl2fNUL-UoXoOu4LsWPLnsnA4nHCACabq4CSzgAB0ChGhmtdHUdMFwuBaNeVo8ir8gcvX-R7hZjSSXtxFu55acoZc_XTURKE5uzoeUO-t-dpuF4e-Yjt5IVYerqtZtlveEA0YzjkA_HeHDDoY37n6sJXWd3rLFT9EkIWBDSi4mNzZdstGs1EaYjc8vfknRmXrsO9vA.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;Can we Make React Faster using the React Compiler?&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;I prototyped a number of optimizations as a way to learn more about the React Compiler and got some significant improvements.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《让React Compiler接管Memoization后，我踩了哪些坑》</title><link>https://channel.meo-ai.com/posts/672</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/672</guid><pubDate>Mon, 06 Jul 2026 01:23:55 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《让React Compiler接管Memoization后，我踩了哪些坑》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ReactCompiler&quot; title=&quot;#ReactCompiler&quot;&gt;#ReactCompiler&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Memoization&quot; title=&quot;#Memoization&quot;&gt;#Memoization&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23NextJS&quot; title=&quot;#NextJS&quot;&gt;#NextJS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ReactHookForm&quot; title=&quot;#ReactHookForm&quot;&gt;#ReactHookForm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;作者在生产级Next.js项目中启用React Compiler v1.0的真实踩坑记录。编译器确实能自动处理大部分memoization，但&quot;大部分&quot;这个词背后藏着不少陷阱：React Hook Form的&lt;code&gt;watch()&lt;/code&gt;因内部可变状态导致实时预览冻结；Chart.js的点击处理器在移除&lt;code&gt;useCallback&lt;/code&gt;后出现数据过时问题；DevTools的Memo徽章仅表示组件被&quot;处理&quot;而非&quot;成功优化&quot;。核心结论是：迁移不是一键操作，需要先升级eslint-plugin-react-hooks、在feature分支启用、用E2E测试覆盖，并保留那些跨越React边界的显式hook。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;1. React Compiler的本质是Babel插件：它通过为每个组件预分配扁平缓存数组（内部hook &lt;code&gt;_c&lt;/code&gt;）来实现比手写&lt;code&gt;useMemo&lt;/code&gt;更细粒度的自动memoization，让你可以删掉大部分显式hook&lt;br /&gt;2. React Hook Form的&lt;code&gt;watch()&lt;/code&gt;直接翻车：启用编译器后，表单的实时预览完全冻结，原因是RHF依赖内部可变状态，编译器无法安全memoize。解决方案是用&lt;code&gt;&quot;use no memo&quot;&lt;/code&gt;指令包裹&lt;code&gt;useForm&lt;/code&gt;的调用&lt;br /&gt;3. 有些&lt;code&gt;useCallback&lt;/code&gt;真的删不得：Chart.js的点击处理器在移除&lt;code&gt;useCallback&lt;/code&gt;后，高并发下偶尔引用旧数据。这不是编译器bug，而是编译器的memoization节奏与外部库（按引用注册回调）的预期不一致，最终选择保留&lt;code&gt;useCallback&lt;/code&gt;并加注释说明&lt;br /&gt;4. DevTools的Memo徽章会误导你：徽章只表示编译器&quot;处理过&quot;该组件，不代表优化成功。即使组件违反React规则（如直接修改props），徽章依然可能出现，真正没徽章的只有显式加了&lt;code&gt;&quot;use no memo&quot;&lt;/code&gt;的组件&lt;br /&gt;5. 迁移有明确的正确顺序：先升级eslint-plugin-react-hooks到v7+并修复lint错误，再在feature分支启用编译器，最后用Profiler和E2E测试验证，不要依赖Memo徽章作为正确性信号&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://blog.logrocket.com/react-compiler-memoization-what-actually-broke/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://blog.logrocket.com/react-compiler-memoization-what-actually-broke/&quot;&gt;https://blog.logrocket.com/react-compiler-memoization-what-actually-broke/&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://blog.logrocket.com/react-compiler-memoization-what-actually-broke&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Learn how to migrate a production Next.js app to React Compiler v1.0, including real breakages with React Hook Form, useMemo, useCallback, and DevTools tips.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;LogRocket Blog&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;I let React Compiler handle memoization: Here&apos;s what actually broke - LogRocket Blog&quot; src=&quot;/static/https://cdn4.telesco.pe/file/PSDVRaLLtN7PYCmhOAHe7nz8EPvCeaAIYw4tjuObhBLvsdKd05uduXZkwn3ukADBA8FYvVsCDyXIT7VnEropsSkWjhe0G-JR--JM3jOFHYFGIB_hR0yMbSSEFcD3KXT-Z-HonITU4yoLCgZrAwwwzLfwOjbBQsEd39WfKImF9V7MwFO774VKCcd7wp-SdZpwxeXI6w-5X4vK85xJ7Fzwq-DqrvRXSvNfQSalmgMjfPjjw70jRZo2Kxd0RmlK0d86nupMChAF5mUaMsTALcGv_tsWz33CMT_qoZ2NGgWm-uuTMR4KGhCORBWn5blOm0RPPijem3cNySpDIollo8YkTQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;I let React Compiler handle memoization: Here&apos;s what actually broke - LogRocket Blog&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Learn how to migrate a production Next.js app to React Compiler v1.0, including real breakages with React Hook Form, useMemo, useCallback, and DevTools tips.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>