๐ค ์์งlog ๐ค
[NextJS] NextJS ์์ Material-Ui ์ฌ์ฉํ๊ธฐ ๋ณธ๋ฌธ
๐ ํ๋ก์ ํธ ์ธํ
- next ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ์ดํ ํ์ํ ๋ํ๋์๋ฅผ ์ค์นํฉ๋๋ค.
npx create-next-app my-app
cd my-app
npm i @emotion/react @emotion/styled @mui/icons-material @mui/material @mui/styles
nextjs๋ ์๋ฒ์ฌ์ด๋๋๋๋ง์ ํ๊ธฐ ๋๋ฌธ์ react์์ mui๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ฒ๋ผ ์์ฝ๊ฒ ๋ฐ์ ๋์ง ์์ต๋๋ค. ๊ทธ๋์ ๋ช๊ฐ์ง ์ฌ์ ์์ ์ ํด์ผํฉ๋๋ค.
๐ _document.tsx
- _document๋ ์๋ฒ์ฌ์ด๋์ ๊ด์ฌํ๋ ๋ก์ง ๋๋ staticํ ๋ก์ง์ ์ถ๊ฐํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค. (_document๊ฐ ํ๋ ์ผ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด nextjs ๊ธฐ๋ณธ (opens new window)์ด ํฌ์คํ ์ ์ฐธ์กฐํด์ฃผ์ธ์.)
- ssr ์ง์์ ์ํด _dococument.tsx์ mui์ ๋ํ ์ฌ์ ์์ ์ ํฉ๋๋ค.
๊ฐ๋จํ ๋งํ๋ฉด ์๋ฒ์์ ๋ฐ์์จ html, css์ ํด๋ผ์ด์ธํธ๊ฐ ๋ ๋๋งํ html, css๊ฐ ๋ค๋ฅด๋ฉด next์์ warning์ ๋์ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์๋ฒ๋จ์์ mui๋ฅผ ์ง์ํจ์ผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ทน์ ๋ง์ถ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ๊ตฌํํฉ๋๋ค.
import React from "react";
import Document, { Html, Head, Main, NextScript } from "next/document";
import { ServerStyleSheets } from "@mui/styles";
export default class MyDocument extends Document {
render() {
return (
<Html>
<body>
<Head></Head>
<Main />
<NextScript />
</body>
</Html>
);
}
}
MyDocument.getInitialProps = async ctx => {
const materialSheets = new ServerStyleSheets();
const originalRenderPage = ctx.renderPage;
ctx.renderPage = () =>
originalRenderPage({
enhanceApp: App => props => materialSheets.collect(<App {...props} />)
});
const initialProps = await Document.getInitialProps(ctx);
return {
...initialProps,
styles: <>{initialProps.styles}</>
};
};
๐ _app.tsx
- nextjs์์ mui๋ฅผ ์ฌ์ฉํ๋๋ฐ ํ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋์ง๋ง ์น์ ์ ์์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด์ ๊ผญ ํ์ํ CssBaseline๋ฅผ ์ด๊ณณ์์ ์ถ๊ฐํฉ๋๋ค.
CssBaseline
- ํ๋ก์ ํธ๋ฅผ ์ฒ์ ๊ตฌ์ํ๊ณ ์คํํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ง๋ค ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ธฐ๋ณธ css๊ฐ default๋ก ์ค์ ๋์ด ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ๋ ์ ์์ ์ธ ๊ตฌํ์ ์ํด ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ผ๊ด์ ์ผ๋ก ๋ณด์ด๋๋ก ํด์ผํฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ css๋ฅผ ์ ์ญ์์ normalize ํ๊ธฐ ์ํด <CssBaseline />๋ฅผ ์ฌ์ฉํฉ๋๋ค. <CssBaseline />๋ ์ฑ์ ์ต์๋จ์ ๋ฃ์ด์ฃผ๋ฉด ์์์ normalize ํด์ค๋๋ค.
// _app.tsx
import type { AppProps } from "next/app";
import CssBaseline from "@mui/material/CssBaseline";
const App = (props: AppProps) => {
const { Component, pageProps } = props;
return (
<>
<CssBaseline />
<Component {...pageProps} />
</>
);
};
export default App;
๐ ์ฌ์ฉํ๊ธฐ
์ฌ๊ธฐ ๊น์ง ์ค์ จ๋ค๋ฉด ๊ธฐ๋ณธ์ ์ธ ์ธํ ์ด ๋ชจ๋ ์๋ฃ๋์์ต๋๋ค. ์ด์ ์ปดํฌ๋ํธ ๋ด๋ถ์์ mui๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import type { NextPage } from "next";
import Button from "@mui/material/Button";
const Home: NextPage = () => {
return (
<div>
<Button variant="contained">Contained</Button>
<Button variant="outlined">Outlined</Button>
</div>
);
};
export default Home;
728x90
'๐ท Next JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NextJS] NextJS ์์ Material-ui์ Styled-components ์ฌ์ฉํ๊ธฐ (0) | 2023.03.24 |
---|---|
[NEXTJS ] getStaticProps( ) ์ getStaticPaths( ) (0) | 2023.02.24 |
[NEXTJS] ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ๋ฐ์ํ๋ html ๋งค์นญ ๋ฌธ์ (0) | 2023.02.21 |
[NextJS] NextJS ์์ window ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ํ ๋ (0) | 2023.01.05 |
[NextJS] NextJS์์ ์ปดํฌ๋ํธํ์์ผ๋ก SVG์ฌ์ฉํ๊ธฐ (0) | 2022.12.05 |