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

如何在Next.js App Router中使用Material UI?解决服务端组件报错

Next.js 13 App Router + Material UI: 解决createContext only works in Client Components报错

问题核心原因

你遇到的问题本质是Next.js 13 App Router的组件执行环境差异:

  • 根布局app/layout.tsx默认是服务端组件(Server Component),这类组件无法调用依赖客户端环境的API(比如React的createContext)。
  • Material UI的CssBaseline内部依赖React Context管理全局样式状态,属于必须在客户端运行的组件,因此直接在服务端组件中引入会触发报错。

快速解决方案

给app/layout.tsx添加客户端组件标识,在文件最顶部加上'use client'指令即可:

'use client';
import { CssBaseline } from '@mui/material';

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>
        <CssBaseline />
        {children}
      </body>
    </html>
  )
}

可选优化方案(保持根布局为服务端组件)

如果你不想把整个根布局转为客户端组件,可以单独封装一个承载CssBaseline的客户端组件:

  1. 创建app/components/ClientCssBaseline.tsx:
'use client';
import { CssBaseline } from '@mui/material';

export default function ClientCssBaseline() {
  return <CssBaseline />;
}
  1. 在根布局中引入这个组件(根布局仍保持服务端组件属性):
import ClientCssBaseline from './components/ClientCssBaseline';

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>
        <ClientCssBaseline />
        {children}
      </body>
    </html>
  )
}

关于官方App Router示例

目前Material UI官方已适配Next.js App Router,基于emotion的默认支持提供了简洁的集成方案,无需复杂迁移Pages Router的旧示例,直接参考官方App Router专属文档即可完成后续配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:17:18