Next.js【详解】服务端组件 vs 客户端组件

Next.js 13 + 新增了服务端组件 和 客户端组件

服务端组件【默认】

服务器端渲染的 React 组件:在服务器上生成 HTML 并发送到客户端

优点

  • 性能优化:由于在服务器端处理数据获取和渲染逻辑,减少了客户端的负担,加快了页面加载速度。
  • 数据安全:可以直接访问服务器端资源,如数据库等,敏感数据无需暴露给客户端。

缺点

无交互状态:没有状态和生命周期方法,不适合处理用户交互。

适用场景

  • 数据获取:适合在服务器端进行数据获取,如从数据库、API 等获取数据,避免客户端请求带来的延迟。
  • 静态内容展示:用于展示不需要交互的静态内容,如文章列表、产品信息等。

客户端组件

传统的 React 组件,会将 JavaScript 代码发送到客户端,在浏览器中进行渲染和交互。

优点

  • 交互性强:可以使用 React 的状态管理、事件处理等功能,实现丰富的用户交互。

缺点

  • 依赖浏览器环境,处理用户输入、响应事件等。
  • 敏感数据会暴露给客户端。
  • 需要向客户端发送 JavaScript 代码,会增加客户端下载和执行的代码量。

适用场景

  • 交互功能:实现需要用户交互的功能,如表单提交、按钮点击、下拉菜单等。
  • 状态管理:当组件需要维护自己的状态时,使用客户端组件,如计数器、购物车等。

语法

在文件顶部添加 “use client”

// 客户端组件示例
"use client";

import React, {
    
     useState } from 'react';

export default function ClientComponent() {
    
    
    const [count, setCount] = useState(0);

    return (
        <div>
            <p>点击次数: {
    
    count}</p>
            <button onClick={
    
    () => setCount(count + 1)}>点击</button>
        </div>
    );
}

组件嵌套

服务器组件可以嵌套客户端组件,但客户端组件不能嵌套服务器组件。

// 服务器组件嵌套客户端组件
export default function ParentServerComponent() {
    
    
    return (
        <div>
            <h1>父服务器组件</h1>
            <ClientComponent />
        </div>
    );
}