Next中引入 Ant Design (antd)的配置

在 Next.js 中引入 Ant Design (antd) 的关键在于解决服务端渲染 (SSR) 的样式问题 。根据你使用的是最新的 App Router 还是传统的 Pages Router,配置方式完全不同。

📦 package.json 依赖配置

首先,安装核心依赖。根据你的路由模式二选一:

json 复制代码
{
  "dependencies": {
    "antd": "^5.0.0", // 核心组件库,两者都需要
    "next": "14.x",

    // --- App Router (推荐) ---
    "@ant-design/nextjs-registry": "^1.0.0", // 处理App Router下的SSR样式

    // --- Pages Router (旧项目) ---
    // "@ant-design/cssinjs": "^1.0.0" // 处理Pages Router下的样式抽取
  }
}

🛠️ 配置与使用代码

1. App Router (Next.js 13/14/15 推荐)

这是目前新项目的标准做法,使用 @ant-design/nextjs-registry 包裹根布局。

步骤 1:修改根布局 (app/layout.tsx)

这是最关键的一步,用于注册 Antd 样式。

tsx 复制代码
import { AntdRegistry } from '@ant-design/nextjs-registry';
import type { Metadata } from 'next';

export const metadata: Metadata = {
  title: 'My App',
};

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body>
        {/* 使用 AntdRegistry 包裹子节点 */}
        <AntdRegistry>{children}</AntdRegistry>
      </body>
    </html>
  );
}

步骤 2:在页面中使用组件 (app/page.tsx)

tsx 复制代码
'use client'; // 如果使用了交互式组件(如Modal),需标记为客户端组件

import { Button, DatePicker, Space } from 'antd';

export default function HomePage() {
  return (
    <div style={{ padding: 50 }}>
      <Space direction="vertical">
        <Button type="primary">Antd Button</Button>
        <DatePicker />
      </Space>
    </div>
  );
}

2. Pages Router (旧版 Next.js)

如果你的项目还在使用 pages 目录,需要通过 _app.tsx_document.tsx 配置。

步骤 1:修改 pages/_document.tsx

用于抽取 SSR 阶段的样式并注入到 HTML 头部。

tsx 复制代码
import { createCache, extractStyle, StyleProvider } from '@ant-design/cssinjs';
import Document, { DocumentContext, Head, Html, Main, NextScript } from 'next/document';

class MyDocument extends Document {
  static async getInitialProps(ctx: DocumentContext) {
    const cache = createCache();
    const originalRenderPage = ctx.renderPage;

    ctx.renderPage = () =>
      originalRenderPage({
        enhanceApp: (App) => (props) => (
          <StyleProvider cache={cache}>
            <App {...props} />
          </StyleProvider>
        ),
      });

    const initialProps = await Document.getInitialProps(ctx);
    const style = extractStyle(cache, true);

    return {
      ...initialProps,
      styles: (
        <>
          {initialProps.styles}
          <style dangerouslySetInnerHTML={{ __html: style }} />
        </>
      ),
    };
  }

  render() {
    return (
      <Html>
        <Head />
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

步骤 2:修改 pages/_app.tsx

tsx 复制代码
import type { AppProps } from 'next/app';
import { ConfigProvider } from 'antd';

export default function App({ Component, pageProps }: AppProps) {
  return (
    <ConfigProvider
      theme={{
        token: {
          colorPrimary: '#00b96b', // 可选:自定义主题
        },
      }}
    >
      <Component {...pageProps} />
    </ConfigProvider>
  );
}

⚙️ Next.js 构建配置 (next.config.js)

Antd 使用了一些 ES6+ 语法,为了确保兼容性,需要在 next.config.js 中配置转译:

javascript 复制代码
/** @type {import('next').NextConfig} */
const nextConfig = {
  transpilePackages: [
    'antd',
    '@ant-design',
    'rc-util',
    'rc-pagination',
    'rc-picker',
    'rc-notification',
    'rc-tooltip',
    'rc-tree',
    'rc-table',
  ],
};

module.exports = nextConfig;

🎯 最佳实践与避坑指南

  1. 路由模式判断 :检查你的项目根目录是 app 还是 pages新项目请务必使用 App Router

  2. 子组件引入方式 (App Router) :在 App Router 下,避免使用 Select.Option 这种点语法,改为直接引入:

    tsx 复制代码
    // ❌ 避免
    import { Select } from 'antd';
    const { Option } = Select;
    
    // ✅ 推荐
    import Select, { Option } from 'antd/es/select';
  3. 版本一致性 :如果使用 Pages Router,确保 @ant-design/cssinjs 的版本与 antd 内部依赖的版本一致,否则可能导致 React 实例冲突。

相关推荐
平头哥AI6 分钟前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang
小小尚@41 分钟前
WebGIS/ECharts 地图开发|MapLand 在线行政区划边界一键下载 GeoJSON 工具
前端·javascript·echarts
葡萄城技术团队1 小时前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei1 小时前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟1 小时前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
一晌小贪欢1 小时前
python-第27天:Python面向对象详解
开发语言·python·数据可视化·面向对象·python办公
默_笙1 小时前
🚍 一条 Todo 的奇幻漂流:TypeScript 全栈类型安全的"护照检查"
前端·javascript
迪康Defender1 小时前
公用电脑责任追溯难?迪康端点安全一体化管理系统用户模式详解
java·运维·开发语言·网络·其他·安全
计算机魔术师2 小时前
NVIDIA 以 129.3 亿美元收购 Hugging Face
前端
平头哥技术团队2 小时前
Day 01 | 用 HTML 写第一个网页:双击就能在浏览器打开
前端