- React의 Ant Design
- Ant Design of React
- Ant Design of React
- v5.21.3Changelog
- 기본 사용법
- 如何使用
- 迁移
- Basic Usage
- 고급기능
- 进阶使用
- Advanced
- Migration
- 其他
- Other
Usage with Next.js
Next.js is currently the most popular React server-side isomorphic framework in the world. This article will try to use antd components in projects created by Next.js.
$ npx create-next-app antd-demo
The tool will create and initialize environment and dependencies automatically, please try config your proxy setting, or use another npm registry if any network errors happen during it.
After the initialization is complete, we enter the project and start.
$ cd antd-demo$ npm run dev
Open the browser at http://localhost:3000/. if you see the NEXT logo, it is considered a success.
Now we install antd from yarn or npm or pnpm or bun.
$ npm install antd --save
Modify src/app/page.tsx, import Button component from antd.
import React from 'react';import { Button } from 'antd';const Home = () => (<div className="App"><Button type="primary">Button</Button></div>);export default Home;
OK, you should now see a blue primary button displayed on the page. Next you can choose any components of antd to develop your application. Visit other workflows of Next.js at its User Guide.
You could find that components of antd do not have styles in the first screen. Next, you need to choose different SSR style processing methods according to the mode of Next.js.
If you are using the App Router in Next.js and using antd as your component library, to make the antd component library work better in your Next.js application and provide a better user experience, you can try using the following method to extract and inject antd's first-screen styles into HTML to avoid page flicker.
@ant-design/nextjs-registry$ npm install @ant-design/nextjs-registry --save
app/layout.tsximport React from 'react';import { AntdRegistry } from '@ant-design/nextjs-registry';const RootLayout = ({ children }: React.PropsWithChildren) => (<html lang="en"><body><AntdRegistry>{children}</AntdRegistry></body></html>);export default RootLayout;
Next.js App Router currently not support using sub-components via . like <Select.Option /> and <Typography.Text />. Importing them from path would solve this problem.
For more detailed information, please refer to with-nextjs-app-router-inline-style。
If you are using the Pages Router in Next.js and using antd as your component library, to make the antd component library work better in your Next.js application and provide a better user experience, you can try using the following method to extract and inject antd's first-screen styles into HTML to avoid page flicker.
@ant-design/cssinjsNotes for developers
Please note that when you install
@ant-design/cssinjs, you must ensure that the version is consistent with the version of@ant-design/cssinjsin localnode_modulesofantd, otherwise, multiple React instances will appear, resulting in ctx being unable to be read correctly. (Tips: you can usenpm ls @ant-design/cssinjscommand to view the local version)
$ npm install @ant-design/cssinjs --save
pages/_document.tsximport React from 'react';import { createCache, extractStyle, StyleProvider } from '@ant-design/cssinjs';import Document, { Head, Html, Main, NextScript } from 'next/document';import type { DocumentContext } from 'next/document';const MyDocument = () => (<Html lang="en"><Head /><body><Main /><NextScript /></body></Html>);MyDocument.getInitialProps = async (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 }} /></>),};};export default MyDocument;
// theme/themeConfig.tsimport type { ThemeConfig } from 'antd';const theme: ThemeConfig = {token: {fontSize: 16,colorPrimary: '#52c41a',},};export default theme;
pages/_app.tsximport React from 'react';import { ConfigProvider } from 'antd';import type { AppProps } from 'next/app';import theme from './theme/themeConfig';const App = ({ Component, pageProps }: AppProps) => (<ConfigProvider theme={theme}><Component {...pageProps} /></ConfigProvider>);export default App;
import React from 'react';import { Button } from 'antd';const Home = () => (<div className="App"><Button type="primary">Button</Button></div>);export default Home;
For more detailed information, please refer to with-nextjs-inline-style.