1. Styled-Components라이브러리
styled-components를 nextjs에 적용하던 중 문제가 발생했다. 화면이 정말 미친듯이 깜빡이기 시작한 것이다.
먼저 styled-components를 사용하던 분이 nextjs에서 styled-components가 문제가 발생할 수 있다고 귀띔해준 것이 기억나서 이것이 그 문제인가보다 하고 바로 구글링에 들어갔다.
2. 왜 화면이 깜빡거리는가?
NextJS는 서버에서 미리 Meta태그 등이 포함되어 있는 HTML을 먼저 만들어 놓은 후 보여주는 ServerSide Rendering 을 제공하기 때문에 HTML에는 손을 댈 수가 없다. 따라서 그 후에 JavaScript를 추가해주어야하는데 Styled-components라이브러리는 css-in-JS인 styled-components는 처음부터 HTML에 추가가 되어 있을 수가 없다. 따라서 HTML이 만들어진 후 추가가 되어야하는데 이 추가가 되는 과정에서 깜빡거리게 되는 것이다.
3. 해결 방법
NextJS에서는 Next앱의 기본 설정을 할 수 있는 파일이 두 가지가 존재한다. 바로 _document.tsx와 _app.tsx이다.
이 파일들을 수정함으로써 Styled-components를 사용할 수 있는데
코드는 다음과 같다.
1. _document.tsx
import Document, { Html, Head, Main, NextScript, DocumentContext } from "next/document";
import { ServerStyleSheet } from "styled-components";
class MyDocument extends Document {
static async getInitialProps(ctx: DocumentContext) {
const sheet = new ServerStyleSheet();
const originalRenderPage = ctx.renderPage;
try {
ctx.renderPage = () =>
originalRenderPage({
enhanceApp: (App) => (props) => sheet.collectStyles(<App {...props} />),
});
const initialProps = await Document.getInitialProps(ctx);
const styleElement = [
<>
{initialProps.styles}
{sheet.getStyleElement()}
</>,
];
return {
...initialProps,
styles: styleElement,
};
} finally {
sheet.seal();
}
}
render() {
return (
<Html>
<html lang="ko" />
<Head></Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}
export default MyDocument;
코드를 살펴보면
이 부분이 styled-components를 담당하는 부분이다.
하지만 _document.tsx는 serverside Rendering만 가능하여 React의 기능들은 사용할 수 없다.
이를 해결하기 위해선 바벨의 플러그인을 추가해주어야한다.
yarn add -D babel-plugin-styled-components
그 후 바벨 설정을 해주는 파일 .babelrc파일을 root경로에 만든 후 다음과 같이 적어준다.
{
"presets": ["next/babel"],
"plugins": [
[
"babel-plugin-styled-components",
{
"ssr": true,
"displayName": false
}
]
]
}
위를 적용하면 styled-components를 Next.js에서 사용할 때 화면이 깜빡거리던 문제를 해결할 수 있다.
'front-end > Nextjs' 카테고리의 다른 글
[NextJs] React-Query로 ServrSide Rendering 구현하기 (2) | 2022.07.30 |
---|---|
[NextJS] 동적 라우팅 (with React-Query) (2) | 2022.07.06 |
[NextJS] NextJS에서의 proxy설정 (2) | 2022.07.01 |
[NextJS] CRA+TypeScript 에서 Nextjs이사 - 폴더 구조 비교 (0) | 2022.06.29 |
[NextJs] CRA+TypeScript에서 NextJS로 이사 (0) | 2022.06.29 |
댓글