You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Next.js 13+的App Router中,所有路由的page.js应设为服务器组件吗?

Next.js 13+ App Router 中 page.js 的组件类型最佳实践

1. page.js 默认是服务器组件的原因

在Next.js 13+的App Router体系里,所有路由文件夹下的page.js默认都是服务器组件,这是框架的原生设计规则。这么做的核心目的是优先服务于性能优化:服务器组件不会被打包到客户端JS bundle中,能直接在服务端完成渲染、数据获取,既提升页面加载速度,又强化SEO表现,还能安全访问服务端专属资源(如服务器环境变量)。

2. 是否必须都用服务器组件?标准实践是什么?

不是强制要求,但优先使用服务器组件是官方推荐的标准实践。

服务器组件适配绝大多数场景:比如需要直接获取数据(无需额外配置就能在组件内写fetch)、渲染静态内容、依赖服务端逻辑的页面。只有当你需要用到客户端专属能力时,才需要考虑转为客户端组件——比如使用useState/useEffect等React Hooks、调用浏览器API(如window/document)、集成表单交互或动画库这类客户端依赖。

3. 使用'use client'转为客户端组件的合理性与注意事项

用'use client'标记page.js完全符合最佳实践,只要你确实有客户端交互的需求,框架会正常处理,构建过程不会出现问题。

但要避免盲目使用:

  • 一旦标记为客户端组件,整个组件及其导入的子组件都会被打包到客户端bundle,会增加客户端JS体积,拖慢加载速度。
  • 客户端组件无法直接访问服务端专属资源(如服务器环境变量),也不能在组件顶层写服务端专属逻辑(比如读取本地文件)。
  • 如果只是页面局部需要交互,建议只给对应子组件加'use client',而非整个page.js——这样能最大化保留服务器组件的性能优势。

4. 构建时的处理逻辑

构建阶段,框架会自动识别page.js的标记:

  • 无'use client'标记时,作为服务器组件处理:静态生成场景下会在构建时预渲染为HTML;SSR场景下则在用户请求时在服务端渲染,最终只把静态HTML发送给客户端,无需加载该组件的JS。
  • 带有'use client'标记时,会被打包进客户端bundle,用户加载页面时会下载并执行这部分JS,负责交互逻辑。

另外,服务器组件和客户端组件可以自由嵌套——服务器组件作为父容器嵌入客户端组件,这是常见的优化方案,框架完全支持。

内容的提问来源于stack exchange,提问作者Abhith Shaji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:23:11