news 2026/5/6 14:30:58

Next.js 客户端组件(Client Components)与服务端组件(Server Components)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Next.js 客户端组件(Client Components)与服务端组件(Server Components)详解

本文基于 Next.js 官方文档Server and Client Components整理,覆盖使用场景、渲染原理、组合规则、最佳实践


一、核心定位

  • 默认类型:App Router 中layout.tsx/page.tsx默认为服务端组件(Server Components)
  • 分工原则:按运行环境拆分逻辑——服务端管渲染与数据,客户端管交互与浏览器 API。

二、使用场景(官方明确边界)

1. 客户端组件 Client Components(必须加'use client'

满足以下任一需求时使用:

  • 需要组件状态useState/useReducer/useRef
  • 需要事件处理onClick/onChange
  • 需要生命周期useEffect
  • 需要浏览器专属 APIwindow/localStorage/navigator
  • 需要自定义 Hooks、React Context
  • 第三方交互组件(轮播、图表、富文本)

2. 服务端组件 Server Components(默认,无需标记)

满足以下任一需求时使用:

  • 就近获取数据:直连数据库、接口,无额外 API 层
  • 安全使用密钥:API Key、Token 不暴露到客户端
  • 减少客户端 JS 体积:服务端渲染,不发 JS 到浏览器
  • 提升首屏性能:优化 FCP,支持流式渲染
  • 纯展示、无交互的静态内容(文章、标题、列表)

三、渲染运行原理(官方流程)

1. 服务端渲染阶段

  • 服务端组件渲染为RSC Payload(React 服务端组件二进制结构)
  • 客户端组件代码 + RSC 用于预渲染HTML
  • 按路由分段(layout / page)拆分,支持流式传输

2. 客户端首次加载

  1. 先展示非交互 HTML,快速呈现内容
  2. 用 RSC 对齐服务端/客户端组件树
  3. 对客户端组件执行水合(hydration),绑定事件变可交互

3. 后续导航

  • 预加载 & 缓存 RSC,实现秒切路由
  • 客户端组件完全在浏览器渲染,不再服务端生成 HTML

关键概念:RSC Payload

  • 服务端组件渲染结果
  • 客户端组件占位与 JS 引用
  • 服务端 → 客户端的可序列化 props

四、基础写法规范

1. 声明方式

  • 服务端组件:无指令,默认就是
  • 客户端组件:文件顶部第一行加'use client'(必须在所有 import 之前)
// 客户端组件示例 'use client' import { useState } from 'react' export default function Counter() { const [count, setCount] = useState(0) return <button onClick={() => setCount(count+1)}>{count}</button> }

2. 数据传递

  • 服务端 → 客户端:用Props传递(必须可序列化)
  • 客户端 → 服务端:不直接传组件,只能传可序列化数据

五、组件组合模式(官方推荐)

1. 服务端嵌套客户端(最常用)

  • 页面/布局(服务端)→ 嵌入交互按钮/表单(客户端)
  • 服务端取数,通过 props 传给客户端做交互
// page.tsx(服务端) import LikeButton from './LikeButton' export default async function Page({ params }) { const post = await getPost(params.id) return <LikeButton likes={post.likes} /> }

2. 客户端嵌套服务端

  • 客户端组件用children作为插槽
  • 服务端组件作为子元素传入,仍在服务端渲染
  • 示例:弹窗(客户端)包裹购物车(服务端)
// Modal(客户端) 'use client' export default function Modal({ children }) { return <div>{children}</div> } // Page(服务端) import Modal from './Modal' import Cart from './Cart' // 服务端组件 export default function Page() { return <Modal><Cart /></Modal> }

3. Context 提供者

  • Context 只能在客户端组件创建
  • 在根布局(服务端)引入包裹全局,实现全局状态共享
// ThemeProvider(客户端) 'use client' import { createContext } from 'react' export const ThemeContext = createContext() export default function ThemeProvider({ children }) { return <ThemeContext.Provider value="dark">{children}</ThemeContext.Provider> } // 根布局(服务端) import ThemeProvider from './ThemeProvider' export default function RootLayout({ children }) { return <html><body><ThemeProvider>{children}</ThemeProvider></body></html> }

4. 第三方组件兼容

  • 依赖客户端特性的库,需包裹一层'use client'再使用
  • 库作者应在入口加'use client'方便用户直接使用

六、性能与安全最佳实践

  1. 最小化客户端边界
    只给真正需要交互的组件加'use client',避免整页变成客户端组件,减小 bundle 体积。

  2. 环境隔离防污染

    • 服务端代码:用server-only包防止被引入客户端
    • 客户端代码:可用client-only标记浏览器专属逻辑
    • 环境变量:非NEXT_PUBLIC_前缀不会注入客户端,防密钥泄露
  3. Provider 尽量下沉
    不要包裹整个html,缩小客户端渲染范围,优化服务端静态内容缓存


七、快速判断口诀(官方思路)

  • 交互、状态、浏览器 API→ 客户端组件('use client'
  • 取数、安全、减包、提速→ 服务端组件(默认)
  • 服务端管数据与渲染,客户端管交互,组合使用最稳

八、核心对比表

维度服务端组件客户端组件
声明默认,无指令必须'use client'
渲染位置服务端客户端
交互能力完整(state/effect/事件)
数据获取直连数据库/API只能走接口
安全密钥可安全使用不可暴露
客户端 JS零打包需发送 JS
首屏性能一般
适用场景展示、取数、SEO交互、状态、浏览器 API
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 14:26:36

球形水蛭量化:高效视觉数据离散化技术解析

1. 球形水蛭量化&#xff1a;视觉离散化的高效方法解析在计算机视觉领域&#xff0c;数据量化一直是提升模型效率的关键技术。最近我在处理高维视觉数据时&#xff0c;发现传统的均匀量化方法在处理球形分布数据时存在显著的信息损失。经过多次实验验证&#xff0c;采用基于球形…

作者头像 李华
网站建设 2026/5/6 14:22:40

终极指南:用Harepacker复活版开启你的MapleStory游戏创作之旅

终极指南&#xff1a;用Harepacker复活版开启你的MapleStory游戏创作之旅 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected 你是否梦想过亲手打…

作者头像 李华
网站建设 2026/5/6 14:17:29

三步搞定百度网盘直连解析:告别限速的终极免费方案

三步搞定百度网盘直连解析&#xff1a;告别限速的终极免费方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载速度而烦恼吗&#xff1f;百度网盘直连解析…

作者头像 李华
网站建设 2026/5/6 14:16:37

黑客是怎么伪造邮件钓鱼的?为什么会有人上当受骗?网络安全零基础入门到入土教程建议收藏!

邮件钓鱼入门到入土 在大型企业边界安全做的越来越好的情况下&#xff0c;不管是 APT 攻击还是红蓝对抗演练&#xff0c;钓鱼和水坑攻击被越来越多的应用。 一、邮件安全的三大协议 1.1 SPF SPF 是 Sender Policy Framework 的缩写&#xff0c;中文译为发送方策略框架。 主要作…

作者头像 李华
网站建设 2026/5/6 14:16:02

FLORIS风电场仿真技术:从尾流建模到AI驱动控制的下一代突破

FLORIS风电场仿真技术&#xff1a;从尾流建模到AI驱动控制的下一代突破 【免费下载链接】floris A controls-oriented engineering wake model. 项目地址: https://gitcode.com/gh_mirrors/fl/floris 在风能技术领域&#xff0c;FLORIS代表了工程尾流建模与控制优化的重…

作者头像 李华
网站建设 2026/5/6 14:14:30

GHelper终极指南:如何用5MB工具完全掌控华硕笔记本性能

GHelper终极指南&#xff1a;如何用5MB工具完全掌控华硕笔记本性能 【免费下载链接】g-helper Fast, native tool for tuning performance, fans, GPU, battery, and RGB on any Asus laptop or handheld - ROG Zephyrus, Flow, Strix, TUF, Vivobook, Zenbook, ProArt, Ally, …

作者头像 李华