Javascript/Next
[NEXTJS] styled-components 적용
eulBlue
2024. 11. 8. 09:33
📱테스트 환경
"react": "19.0.0-rc-02c0e824-20241028",
"react-dom": "19.0.0-rc-02c0e824-20241028",
"next": "15.0.2"
[NextJS] Syled-components 사용하는 방법
📱테스트 환경 "react": "18.2.0" "react-dom": "18.2.0" "typescript": "^5.1.6" 😢 내가 겪은 문제 개발환경 ( http ) 에서는 문제가 없었는데 배포환경 ( https ) 에서는 한번씩 디자인이 깨졌다. 아니면 새로고침
8735.tistory.com
작년에 작성한적이있는데 새롭게 적용하려고
문서를 좀 찾아보다보니 적용하는 방법이 변경됐었다.
버전이 업데이트되면서 사용방식도 변경된것같은데 이에맞춰서
최신버전에 맞게 다시 작성하려고 한다.
const nextConfig = {
...
compiler: {
...
styledComponents: true,
}
};
next.config.ts(js) 에 추가해주고
// GlobalStyles.tsx
"use client";
import { createGlobalStyle } from "styled-components";
export const GlobalStyles = createGlobalStyle`
* {
margin: 0;
padding: 0;
}
`;
// StyledComponentsRegistry.tsx
"use client";
import React, { useState } from "react";
import { useServerInsertedHTML } from "next/navigation";
import { ServerStyleSheet, StyleSheetManager } from "styled-components";
type StyledComponentsRegistryProps = {
children: React.ReactNode;
};
export const StyledComponentsRegistry = ({ children }: StyledComponentsRegistryProps) => {
const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet());
useServerInsertedHTML(() => {
const styles = styledComponentsStyleSheet.getStyleElement();
styledComponentsStyleSheet.instance.clearTag();
return <>{styles}</>;
});
if (typeof window !== "undefined") return <>{children}</>;
return (
<StyleSheetManager sheet={styledComponentsStyleSheet.instance}>{children}</StyleSheetManager>
);
};
lib 폴더를 만들고 그 안에 두개의 파일을 만들어서
넣어준다. 이게 SSR 에서 Styled-component 가 적용될때
스타일이 적용되지않은채 보이는 현상을 막아줄 것이다.
나는 pages 구조이기 때문에 _document.tsx 파일에 설정해준다.
import { Html, Head, Main, NextScript } from "next/document";
import {GlobalStyles} from "@/lib/GlobalStyles";
import {StyledComponentsRegistry} from "@/lib/StyledComponentsRegistry";
export default function Document() {
return (
<Html lang="en">
<Head />
<body className="antialiased">
<GlobalStyles />
<StyledComponentsRegistry>
<Main />
<NextScript />
</StyledComponentsRegistry>
</body>
</Html>
);
}
apps 구조인 경우는 공식문서를 따로 다시 찾아봐야한다 ㅎ