App Router 迁移半年,聊聊踩过的坑
把一个 Pages Router 项目分批迁到 App Router,前后折腾了快半年。最大的感受是:缓存边界和 "use client" 这两件事,文档轻描淡写,实际占了 80% 的坑。 中间遇到过几次经典翻车: 客户端组件里直接 fetch ,被默认缓存导致数据不刷新。 pa
Next.js、React、TypeScript、前端工程化
本专题收录 Web 开发 方向的文章和社区讨论,重点关注真实工程场景、工具选择、实践路径和风险边界。
页面会持续更新,适合作为学习路线、选型参考和技术复盘入口。
把一个 Pages Router 项目分批迁到 App Router,前后折腾了快半年。最大的感受是:缓存边界和 "use client" 这两件事,文档轻描淡写,实际占了 80% 的坑。 中间遇到过几次经典翻车: 客户端组件里直接 fetch ,被默认缓存导致数据不刷新。 pa
看了不少文章,还是没完全 get 到 RSC 的核心价值。表面说是 "组件在服务端跑",但 SSR 不也能在服务端跑组件吗? 我自己理解下来,主要差在两点:RSC 是 "按组件粒度" 决定跑在哪,并且它能直接访问数据源,不用再走一层 API。组件树里零 JS 下发到客户端这点确实
App Router 里用 useSearchParams 拿 query 参数,本地 dev 没事,prod 一打开就报 hydration mismatch,浏览器控制台一片红。 查了一圈说是它会让页面退化成客户端渲染,需要包一层 <Suspense 。包了之后报错没了,但首
针对响应式布局在“修复只在真实浏览器出现的问题”里的落地问题,本文用键盘操作记录检查越界修改,并邀请社区比较不同取舍。
这条Web 开发种子内容关注缓存失效的工程闭环,覆盖“将人工流程变成可验证脚本”中的越界修改、验收门槛和失败恢复。
用合成案例讨论组件契约:当“将人工流程变成可验证脚本”碰到模型总是改到无关文件,如何留下键盘操作记录并保留人工决策点。
团队里在推 RSC 直接调 Prisma 查数据,省掉一层 API route。但我心里一直有个疑问:这样写会不会把数据库 schema 间接带到客户端 bundle 里? 我试了下,只要不在 client component 里 import 那些查询函数,Prisma 的代码
项目里把表单提交全换成了 Server Actions,整体真香,但坑也不少。最大的爽点是省了 API route、省了手写 fetch,form 提交后直接拿到新数据重渲染。 不爽的地方: 错误处理有点别扭, useActionState 的返回值结构要自己约定。 上传文件场景
一个内容站,详情页用 ISR, revalidate 设成 60 秒。大部分页面 OK,但有些带多个 tag 的聚合页经常好几分钟都不更新。 后来发现是 CDN 层的 s maxage 把它兜住了,ISR 这边其实早就重新生成了,但边缘节点没回源。把 Cache Control
Next 15 的缓存四件套——Data Cache、Full Route Cache、Router Cache、Request Memoize——文档看完了还是分不清。经常出现 "改了数据但页面没变" 或 "登录态串了" 的情况。 我自己总结了一个粗暴的判断法: 跨请求共享的数
动态路由 [slug] 这块, generateStaticParams 决定哪些路径在 build 时预生成, dynamicParams 控制其它路径能不能按需生成。这俩参数配合起来我一直没整明白。 试出来的结论: dynamicParams: true (默认):没列出来的
团队规模上来之后,App Router 的目录约定变得越来越重要。分享一份我们用了一年的结构: 几个硬约定: app/ 下的 page 不写业务逻辑,只组装。 数据访问统一走 lib/db/ .server.ts ,文件名后缀卡边界。 Server Actions 放 featu