javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > Next.js16实践和坑点

Next.js 16的实践案例和坑点总结

作者:懒人村杂货铺

Next.js16的到来,总体来说对Next.js开发者来说是好事,并且让我看到了未来在技术选择中,是否对AI友好将会成为关键点,这篇文章主要介绍了Next.js 16实践案例和坑点的相关资料,需要的朋友可以参考下

一、基于 Next.js 16 的关键变化(必须知道)

这是你在网上很难看到的“升级后必须掌握的关键点”。

1. Server Components 为默认,Client Components 仅用于交互

Next 16 更强调 SSG/SSR 和 RSC,推荐你:

带来的优势:

2. 全新Cache Components(Next 16 最大变化)

Next 16 引入一个新模式:

export default async function Page() { const data = await getData(); // 自动缓存 return <div>{data}</div>; } 

特点:

你也可以强制禁用缓存:

export const dynamic = "force-dynamic"; 

或页面级别缓存:

export const revalidate = 60; // 60秒 

3. 中间件新方案:proxy.ts

Next 16 引入 Proxy Routes:

app/proxy.ts 

它的作用是:

使用示例:

export default function proxy(request) { const token = request.cookies.get("token"); if (!token) { return Response.redirect("/login"); } } 

比 middleware 更灵活。

4. 默认使用Turbopack(更快)

生产环境已经支持:

但现阶段仍有一些兼容性问题(后面会讲坑点)。

5. 全面支持 React 19(useTransition/useForm 等)

Next 16 默认支持:

二、Next.js 16 的项目实战最佳实践

这些是做实际项目最关键的。

1. 目录结构最佳实践

app/ (public)/layout.tsx # 公共布局 dashboard/ page.tsx loading.tsx error.tsx api/ user/route.ts # Route Handlers API lib/ db.ts # 数据库 services/ components/ ui/ # 客户端组件库 server/ # 服务器组件 

建议:

内容写在哪里
页面结构Server Components
表单、按钮、交互Client Components
业务逻辑(读库/计算)lib/services
API 处理route.ts
鉴权、重定向proxy.ts

2. 数据获取的最佳实践(强烈推荐)

能在 Server 取数据,一律放 Server

最推荐的方式:

export default async function Page() { const user = await getUser(); return <UserView user={user} />; } 

避免写成下面这种:

(不然就是 CSR)

"use client"; useEffect(() => { fetch("/api/user").then(...) }, []); 

3. Server Action 使用策略

处理表单提交最推荐:

"use server" export async function createUser(formData) { const name = formData.get("name"); await db.user.create({ data: { name } }); } 

客户端:

<form action={createUser}> <input name="name" /> </form> 

优点:

三、Next.js 16 实战最常见35 个坑点

1.use client忘记写 → 事件不触发(最常见)

"use client"; 

必须放在第一行。

2. Server Component 使用 window / useEffect 直接报错

Server Component 不能:

3. fetch 在 Next.js 中默认“缓存”,开发环境和生产环境不一致

很多人踩这里👇

开发环境:

生产环境:

解决:

fetch(url, { cache: "no-store" }) 

4. fetch 自动请求合并(Request Deduping)

相同 fetch 会合并成一次:

const a = fetch("/api/user"); const b = fetch("/api/user"); 

🚨 结果后台只收到 1 次请求。

如果你需要多次真实请求:

cache: "no-store" 

5. layout.tsx 会持久化渲染,状态不会变化

这导致:

解决:

把需要交互的部分移到 Client Component + Context。

6. metadata 不能写在 Client 文件中

必须写在 server component:

export const metadata = { title: "User", }; 

7. redirect() / notFound() 不能放在 Client Component 中

SSR 专用。

8. Route Handler 中读取 body 只能读一次

这会报错:

const body1 = await req.json(); const body2 = await req.json(); // ❌ 

9. 静态资源路径错误:不能写 public

/public/logo.png ❌ /logo.png ✔ 

10. middleware 和 proxy.ts 配置冲突

proxy 优先级高
middleware 无法覆盖 proxy 的行为。

11. 使用 next/image 导致生产环境 403

你必须配置:

remotePatterns 

12. Turbopack 打包时某些库不支持 CommonJS

比如一些老库,用 webpack 才能正常构建。

解决:关闭 turbopack

NEXT_USE_TURBOPACK=0 

13. 环境变量必须以 NEXT_PUBLIC_ 才能给客户端用

否则 undefined。

14. “hydration mismatch” 是 Next.js 最常见报错

原因:

15. 动态导入组件,SSR 必须手动关闭

const Editor = dynamic(() => import('./Editor'), { ssr: false }); 

16. 在 GitHub / Vercel 构建时 Prisma 报错

因为 schema 未生成:

prisma generate 

必须加到构建脚本。

17. Next.js 在边缘运行时不支持 Node API

例如:

18. next/link 的 children 不能是空标签

必须:

<Link href="/"><span>Home</span></Link> 

19. API route 和 Route Handler 混用会导致路由冲突

推荐只使用:

app/api/**/route.ts 

20. 组件变成 Client Component 会让整个子树变成 CSR

这是性能杀手。

尽量拆分:

更多坑点(快速列表)

  1. 每次刷新 global CSS 会闪屏

  2. Middleware / proxy.ts 不支持 request body

  3. 当 Layout 中 useSearchParams 会多次渲染

  4. 动态路由不带 trailing slash 会冲突

  5. pages/ 与 app/ 路由同名 → 冲突

  6. 使用 form 表单 + JS 禁止默认行为 → 无法 SSR

  7. Route Handler 返回流式响应复杂

  8. 静态文件增删不会触发热更新

  9. 错误边界 error.tsx 不能用 useEffect 捕获

  10. React Server Components 不支持一些旧 UI 库

  11. next build 不能直接使用 require

  12. bundler 无法处理某些 old-style ESM

  13. preload + next/script 干扰生产环境性能

  14. Bun/PNPM 与 Turbopack 兼容性偶发问题

  15. “Concurrent features” 在 Node 16 以上才稳定

总结 

到此这篇关于Next.js 16的实践案例和坑点总结的文章就介绍到这了,更多相关Next.js16实践和坑点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文