--- order: 4 title: 在 Next.js 中使用 --- [Next.js](https://nextjs.org/) 是目前世界上最流行的 React 服务端同构框架,本文会尝试在 Next.js 创建的工程中使用 `antd` 组件。 ## 安装和初始化 在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/)。 工具会自动初始化一个脚手架并安装项目的各种必要依赖,在安装过程中,有一些配置项需要自行选择,如果在过程中出现网络问题,请尝试配置代理,或使用其他 npm registry。 初始化完成后,我们进入项目并启动。 ```bash $ cd antd-demo $ npm run dev ``` 此时使用浏览器访问 http://localhost:3000/ ,看到 NEXT 的 logo 就算成功了。 ## 引入 antd 现在从 yarn 或 npm 或 pnpm 安装并引入 antd。 修改 `src/app/page.tsx`,引入 antd 的按钮组件。 ```jsx 'use client'; import React from 'react'; import { Button } from 'antd'; const Home = () => (
); export default Home; ``` 好了,现在你应该能看到页面上已经有了 `antd` 的蓝色按钮组件,接下来就可以继续选用其他组件开发应用了。其他开发流程你可以参考 Next.js 的[官方文档](https://nextjs.org/)。 我们现在已经把 antd 组件成功运行起来了,开始开发你的应用吧! ## 使用 Next.js 的 Pages Router 如果你在 Next.js 当中使用了 Pages Router, 并使用 antd 作为页面组件库,为了让 antd 组件库在你的 Next.js 应用中能够更好的工作,提供更好的用户体验,你可以尝试使用下面的方式将 antd 首屏样式按需抽离并植入到 HTML 中,以避免页面闪动的情况。 1. 安装 `@ant-design/cssinjs` 2. 改写 `pages/_document.tsx` ```tsx import { StyleProvider, createCache, extractStyle } from '@ant-design/cssinjs'; import Document, { DocumentContext, Head, Html, Main, NextScript } from 'next/document'; const MyDocument = () => (
); MyDocument.getInitialProps = async (ctx: DocumentContext) => { const cache = createCache(); const originalRenderPage = ctx.renderPage; ctx.renderPage = () => originalRenderPage({ enhanceApp: (App) => (props) => ( ), }); const initialProps = await Document.getInitialProps(ctx); // 1.1 extract style which had been used const style = extractStyle(cache, true); return { ...initialProps, styles: ( <> {initialProps.styles} {/* 1.2 inject css */} ), }; }; export default MyDocument; ``` 3. 支持自定义主题 ```ts // theme/themeConfig.ts import type { ThemeConfig } from 'antd'; const theme: ThemeConfig = { token: { fontSize: 16, colorPrimary: '#52c41a', }, }; export default theme; ``` 4. 改写 `pages/_app.tsx` ```tsx import { ConfigProvider } from 'antd'; import type { AppProps } from 'next/app'; import theme from './themeConfig'; const App = ({ Component, pageProps }: AppProps) => ( ); export default App; ``` 5. 在页面中使用 antd ```tsx import { Button } from 'antd'; const Home = () => (
); export default Home; ``` 更多详细的细节可以参考 [with-nextjs-inline-style](https://github.com/ant-design/ant-design-examples/tree/main/examples/with-nextjs-inline-style)。 ## 使用 Next.js 的 App Router 如果你在 Next.js 当中使用了 App Router, 并使用 antd 作为页面组件库,为了让 antd 组件库在你的 Next.js 应用中能够更好的工作,提供更好的用户体验,你可以尝试使用下面的方式将 antd 首屏样式按需抽离并植入到 HTML 中,以避免页面闪动的情况。 1. 安装 `@ant-design/cssinjs` 2. 创建 `lib/AntdRegistry.tsx` ```tsx import { StyleProvider, createCache, extractStyle } from '@ant-design/cssinjs'; import { useServerInsertedHTML } from 'next/navigation'; import React from 'react'; const StyledComponentsRegistry = ({ children }: { children: React.ReactNode }) => { const cache = createCache(); useServerInsertedHTML(() => (