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

如何在Next.js v13中完全禁用服务端渲染?

问题分析与解决

首先得明确:Next.js 里的 'use client' 并不是完全禁用服务端渲染,它的作用是标记组件为客户端组件,让组件可以使用客户端特有的API(比如 useState、useEffect,或者访问 window 对象),但客户端组件依然会在服务端完成首次渲染(也就是SSR),然后在客户端进行水合(Hydrate)。

你测试代码里的 console.log('SERVER RENDER (page)') 会在服务端输出,是因为首次渲染阶段服务端会执行组件代码生成HTML,这个 log 就会在服务端控制台打印。如果要验证组件是否真的是客户端组件,可以把 log 放到 useEffect 里,因为 useEffect 只会在客户端执行:

'use client';

import { useEffect } from 'react';

export default () => {
  useEffect(() => {
    console.log('CLIENT SIDE ONLY');
  }, []);

  return (
    <div>test</div>
  );
};

这样执行 next dev 时,服务端不会输出这个 log,只有浏览器控制台会打印,这才是客户端组件的特征。

另外,Layout 和 Page 组件即使加了 'use client',Next.js 依然会在服务端做首次渲染,这是框架的默认行为,目的是保证首屏性能和SEO。如果确实需要完全不在服务端渲染某个组件,可以考虑把它放到一个动态导入的组件里,并且禁用SSR:

// 父组件(可以是Page或Layout)
import dynamic from 'next/dynamic';

const ClientOnlyComponent = dynamic(() => import('./ClientComponent'), {
  ssr: false,
  loading: () => <div>Loading...</div>
});

export default function Page() {
  return <ClientOnlyComponent />;
}

这样 ClientComponent 就只会在客户端渲染,不会在服务端执行任何代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:41:29