ant-design/docs/react/use-with-next.en-US.md
kiner-tang(文辉) ca35f2f891
docs: update docs about app router in use-with-next (#43579)
* docs: update docs

* docs: update docs

* feat: optimize code

* docs: update docs

* docs: update docs
2023-07-16 12:13:22 +08:00

4.4 KiB

order title
4 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.

Install and Initialization

Before all start, you may need install yarn or pnpm.

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.

Import antd

Now we install antd from yarn or npm or pnpm.

Modify src/app/page.tsx, import Button component from antd.

'use client';

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.

We are successfully running antd components now, go build your own application!

Using Next.js App Router

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.

  1. Install @ant-design/cssinjs

  1. Create lib/AntdRegistry.tsx
'use client';

import React from 'react';
import { useServerInsertedHTML } from 'next/navigation';
import { StyleProvider, createCache, extractStyle } from '@ant-design/cssinjs';

export default function StyledComponentsRegistry({ children }: { children: React.ReactNode }) {
  const cache = createCache();

  useServerInsertedHTML(() => (
    <style id="antd" dangerouslySetInnerHTML={{ __html: extractStyle(cache, true) }}></style>
  ));

  return <StyleProvider cache={cache}>{children}</StyleProvider>;
}
  1. Use it in app/layout.tsx
import StyledComponentsRegistry from '../lib/AntdRegistry';
import './globals.css';
import { Inter } from 'next/font/google';

const inter = Inter({ subsets: ['latin'] });

export const metadata = {
  title: 'Create Next App',
  description: 'Generated by create next app',
};

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <StyledComponentsRegistry>{children}</StyledComponentsRegistry>
      </body>
    </html>
  );
}
  1. Customize theme in theme/*.tsx
'use client';

// theme/index.tsx
import React from 'react';
import { ConfigProvider } from 'antd';

const withTheme = (node: JSX.Element) => (
  <ConfigProvider
    theme={{
      token: {
        colorPrimary: '#52c41a',
      },
    }}
  >
    {/* nesting */}
    <ConfigProvider
      theme={{
        token: {
          borderRadius: 16,
        },
      }}
    >
      {node}
    </ConfigProvider>
  </ConfigProvider>
);

export default withTheme;
  1. Use in page
'use client';

import React from 'react';
import { Button } from 'antd';
import withTheme from '../../theme';

const Home = function Home() {
  return (
    <div className="App">
      <Button type="primary">Button</Button>
    </div>
  );
};

const HomePage = () => {
  return withTheme(<Home />);
};

export default HomePage;

For more detailed information, please refer to with-nextjs-app-router-inline-style