升级 React 19 后,发现部分 useEffect 莫名其妙跑了两次。一开始以为是 Strict Mode(本来就跑两次),但 prod 构建里也出现了。
最后定位到是用了 React Compiler 之后,有些 effect 被自动 memo 化,依赖收集变了,触发了额外执行。关掉 compiler 后恢复正常。
官方说这算 "正确行为",但对有副作用的代码(埋点、支付)真的很危险。
大家是怎么保证 effect 只跑一次的?ref 标志位算最佳实践吗?
升级 React 19 后,发现部分 useEffect 莫名其妙跑了两次。一开始以为是 Strict Mode(本来就跑两次),但 prod 构建里也出现了。
最后定位到是用了 React Compiler 之后,有些 effect 被自动 memo 化,依赖收集变了,触发了额外执行。关掉 compiler 后恢复正常。
官方说这算 "正确行为",但对有副作用的代码(埋点、支付)真的很危险。
大家是怎么保证 effect 只跑一次的?ref 标志位算最佳实践吗?
暂时没有回复。
Related
讨论
社区讨论帖,欢迎分享你的经验和观点。
讨论
把一个 Pages Router 项目分批迁到 App Router,前后折腾了快半年。最大的感受是:缓存边界和 "use client" 这两件事,文档轻描淡写,实际占了 80% 的坑。 中间遇到过几次经典翻车: 客户端组件里直接 fetch ,被默认缓存导致数据不刷新。 pa
讨论
看了不少文章,还是没完全 get 到 RSC 的核心价值。表面说是 "组件在服务端跑",但 SSR 不也能在服务端跑组件吗? 我自己理解下来,主要差在两点:RSC 是 "按组件粒度" 决定跑在哪,并且它能直接访问数据源,不用再走一层 API。组件树里零 JS 下发到客户端这点确实
讨论
App Router 里用 useSearchParams 拿 query 参数,本地 dev 没事,prod 一打开就报 hydration mismatch,浏览器控制台一片红。 查了一圈说是它会让页面退化成客户端渲染,需要包一层 <Suspense 。包了之后报错没了,但首