🤔 문제 상황
tailwind-styled-components를 사용해서 스타일을 부여했는데
초기 렌더링되는 찰나에 css가 적용되지 않는 문제가 있었다.
자바스크립트 파일이 다운로드 되고 나서야 제대로 적용되니 보기 싫었다.
css가 next.js가 ssr할 때 부여되도록 설정이 따로 필요했다.
Next.js + tailwind + styled-components를 결합할 때
twin.marco + emotion 조합을 더 많이 사용해서 자료가 많았는데,
Next.js와 tailwind-styled-components를 사용하는 경우는 많지 않아서
자료 찾기가 어려웠다. 그래도 좋은 글들이 몇 개 있어서 참고해서 해결했다.
✅ 해결 방법
ssr 적용하지 않는다면 styled-components를 깔지 않고
Tailwind-styled-components만 사용해도 괜찮지만
적용한다면 styled-components도 깔아야한다.
Tailwind-styled-components는 따로 설정할 것이 없다.
1. 필요한 패키지 설치
- styled-components
- tailwindcss & tailwindcss-cli & raw-loader
$npm i styled-components @types/styled-components
$npm i tailwindcss tailwindcss-cli raw-loader
2. package.json script 옵션 추가
tailwind를 빌드시에 넣어야 하니까 script안에 해당 코드를 넣어줌
"scripts": {
"prebuild": "tailwindcss-cli build -o styles/tailwindSSR.css"
},
3. _document
수정
이 파일 안에서 구성이 좀 복잡해진다.
단순하게 얘기하면 styled-components에서 ServerStyleSheet라는 기능을 가져와서
head 태그 안에 styled-components를 style태그로 넣어줌
그리고 tailwindSSR에서 bundleCSS를 가져와서 tailwind를 css로 빌드해서 넣는 것이다.
주의할 점은 //@ts-ignore
주석을 생략하지 말 것! (에러 발생함)
import Document, {
DocumentContext,
Html,
Head,
Main,
NextScript,
} from "next/document";
import { ServerStyleSheet } from "styled-components"; // head 태그 안에 styled-components를 style태그로 넣어줌
// @ts-ignore
import bundleCss from "!raw-loader!../assets/styles/tailwindSSR.css"; // 위에 @ts-ignore 생략시 오류 발생
export default 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);
return {
...initialProps,
styles: (
<>
{initialProps.styles}
{sheet.getStyleElement()}
</>
),
};
} finally {
sheet.seal();
}
}
render() {
return (
<Html lang="en">
<Head>
<meta property="og:title" content="Next.js로 만든 사이트" />
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}
4. tailwind-styled-components 설치
$ npm i tailwind-styled-components
이제 tailwind-styled-components를 설치하고 사용하면 된다.
이렇게 하면 javascript 옵션을 꺼도 css가 적용된 화면을 볼 수 있다.
javascript 옵션 끄기는 크롬 확장 프로그램 quick javascript switch 사용하면 된다.
'Programming > Client' 카테고리의 다른 글
[Next.js] 플러그인 사용없이 SEO(검색 엔진 최적화)하기 (0) | 2023.04.24 |
---|---|
웹 사이트 성능 측정 및 최적화 (with LightHouse) (0) | 2023.04.06 |
[Typescript] 'HTMLElement | null' 형식은 'HTMLElement' 형식에 할당할 수 없습니다. (0) | 2023.03.30 |
[React] 프론트단에서 페이지네이션 구현하기 (0) | 2023.02.15 |
[Javascript] formData로 이미지, 문자열 묶어서 전달하기 (0) | 2023.01.08 |