App Router 迁移半年,聊聊踩过的坑
把一个 Pages Router 项目分批迁到 App Router,前后折腾了快半年。最大的感受是:缓存边界和 "use client" 这两件事,文档轻描淡写,实际占了 80% 的坑。 中间遇到过几次经典翻车: 客户端组件里直接 fetch ,被默认缓存导致数据不刷新。 pa
这里聚合 CodeNodeX AI 社区中与 React 相关的技术文章和讨论,覆盖概念解释、工具对比、工程实践、常见问题和独立开发经验。
如果你正在研究 React,建议先阅读高质量长文,再参与帖子讨论,形成从理解到实践的完整路径。
把一个 Pages Router 项目分批迁到 App Router,前后折腾了快半年。最大的感受是:缓存边界和 "use client" 这两件事,文档轻描淡写,实际占了 80% 的坑。 中间遇到过几次经典翻车: 客户端组件里直接 fetch ,被默认缓存导致数据不刷新。 pa
看了不少文章,还是没完全 get 到 RSC 的核心价值。表面说是 "组件在服务端跑",但 SSR 不也能在服务端跑组件吗? 我自己理解下来,主要差在两点:RSC 是 "按组件粒度" 决定跑在哪,并且它能直接访问数据源,不用再走一层 API。组件树里零 JS 下发到客户端这点确实
App Router 里用 useSearchParams 拿 query 参数,本地 dev 没事,prod 一打开就报 hydration mismatch,浏览器控制台一片红。 查了一圈说是它会让页面退化成客户端渲染,需要包一层 <Suspense 。包了之后报错没了,但首
项目里把表单提交全换成了 Server Actions,整体真香,但坑也不少。最大的爽点是省了 API route、省了手写 fetch,form 提交后直接拿到新数据重渲染。 不爽的地方: 错误处理有点别扭, useActionState 的返回值结构要自己约定。 上传文件场景
新项目立项,团队在纠结这个。我倾向 Next.js(SSR/SEO 友好),但同事觉得 Vite + React 更灵活、构建快、心智负担小。 我的判断标准大概是这样: 重 SEO、内容型、有 SSR 需求 → Next.js。 中后台、登录后应用、纯交互 → Vite SPA。
升级到 React 19 后试了下 use() 这个新 hook,能直接读 Promise,写起来确实比 useEffect + useState 简洁。 但用着用着发现几个问题:同一个 Promise 重复 use 不会复用结果,得自己 memo;错误处理还是要靠 ErrorB
升级 React 19 后,发现部分 useEffect 莫名其妙跑了两次。一开始以为是 Strict Mode(本来就跑两次),但 prod 构建里也出现了。 最后定位到是用了 React Compiler 之后,有些 effect 被自动 memo 化,依赖收集变了,触发了额
React 19 的 useFormStatus 配合 Server Actions,做表单提交体验非常好。提交按钮的 loading 态一行就搞定: 关键是不用再手动维护 state,组件也更干净。配合 useActionState 拿错误信息,整个表单几乎零样板代码。 唯一不
试了下 useActionState ,整体思路很好,但 API 设计有点绕。它要传一个 reducer 风格的函数,返回值是 [state, action, isPending] ,跟传统 hook 习惯不太一样。 pending 是后加的,之前还得自己包一个 transiti
React Compiler 上 stable 之后,我把项目里所有的 useMemo 、 useCallback 、 React.memo 全删了,编译器自动处理 memoization。代码瞬间清爽了一大截。 实测性能:大部分场景持平或略好,个别列表渲染场景还快了点。但有一个
Server Actions 的入参校验一直是个头疼事,最近全面接入了 Zod,体验明显好。 好处是 schema 和类型同源,再也不用两边维护。配合 react hook form 的 resolver,表单校验也复用同一份。 不爽的点: 运行时校验有性能开销,热点路径要测。
Tailwind v4 把配置全改成 CSS first, tailwind.config.js 基本不用了,主题写在 CSS 里。升级的时候踩了不少坑。 自定义颜色要从 theme 函数改成 @theme 块。 插件系统大改,老插件基本都得换。 Content 配置自动检测了,