CSS-in-JS 라이브러리.
Next.js의 내장 기능이기 때문에 패키지를 설치할 필요 없이 프로젝트를 시작하고 바로 사용할 수 있음.
export default function Button() {
return (
<>
<button className="button">버튼</button>
<style jsx>{`
.button {
padding: 1em;
border-radius: 1em;
border: none;
background: green;
color: white;
}
`}</style>
</>
);
}
→ 동적인 CSS 규칙을 만들 수 있음, 다른 컴포넌트에 영향을 주거나 충돌을 일으키지 않음.
모든 컴포넌트에 적용할 CSS 규칙을 만들 때는 global
속성을 지정
export default function Highlight() {
return (
<>
<span>hello</span>
<style jsx global>{`
span {
background: yello;
font-weight: bold;
}
`}</style>
</>
);
}
CSS 클래스를 충돌이 일어나지 않게 만들면서 실행 시간 동안 성능 부하 없이 리액트 컴포넌트에서 CSS 컴포넌트를 불러올 수 있음.
CSS Module은 각 규칙에 고유한 이름을 만들어서 충돌이 일어나지 않음
:global 키원드를 사용해 전역 CSS 규칙을 만들 수 있음.
.button :global {
padding: 5px;
background-color: blue;
}
CSS Module에는 셀렉터 컴포지션이라는 기능이 있다.
통상적으로 사용할 수 있는 규칙을 만들고 composes
속성을 지정해서 일부 속성을 덮어쓸 수 있다.
.button-default {
padding: 5px;
background-color: black;
}
.button-green {
composes: button-default;
background-color: green;
color: white;
}
.button-red {
composes: button-default;
background-color: red;
color: black;
}
Next.js는 PostCSS라는 CSS 컴파일 도구를 사용해서 빌드 시점에 CSS Module을 컴파일한다.
그 외에도 Next.js에서는 다음 기능들을 기본적으로 제공한다.
Next.js에서 기본적으로 SASS를 지원.
다만 sass 패키지는 설치해야함.
$ yarn add sass
SASS문법으로 CSS Module을 만들고 사용할 수 있음
ex) Home.module.scss
CSS Module의 composes
속성을 SASS에서는 @extend
키워드를 사용할 수 있음.
.button-default {
padding: 5px;
background-color: black;
}
.button-green {
@extend .button-default;
background-color: green;
color: white;
}
.button-red {
@extend .button-default;
background-color: red;
color: black;
}
중첩 셀렉터 기능도 가능
Next.js 의 경우 SSR, SSG 상황에서 빌드할 때 CSS 을 넣어줍니다.
하지만 styled-components 를 사용하는 경우 문제가 발생합니다. (Emotion 의 경우 v10 이후 버전 사용하면 ✅)
SSR, SSG 의 경우 사용자가 접속하면 서버에서 만든 HTML 을 사용자에게 주는데 이 때 style 태그가 빈 상태로 넘어가고, 브라우저가 JS 파일을 받아 실행시켰을 때 비로소 스타일이 적용됩니다.
@출처
따라서 styled-components의 경우는 추가 설정이 필요함.
Emotion은 Next.js에서 별도의 추가설정 없이 SSR을 사용할 수 있다.
styled-components와 비교했을 때 비교적 빠른 성능, 작은 번들사이즈가 장점.
하지만 styled-components가 제공하는 심화적인 기능은 사용 불가 (attrs 등..)
많이 사용하는 기능을 추상화하고 서로 다른 UI 간에도 코드 재사용을 최대화, 생산성 향상.
UI 컴포넌트에 테마를 적용할 수 있음. → 원하는대로 수정할 수 있음.
패키지 설치
$ yarn add @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^4
@chakra-ui/icons
사용하기 위해 ChakraProvider
로 감싼다.
import { ChakraProvider } from '@chakra-ui/react';
function MyApp({ Component, pageProps }) {
return (
<ChakraProvider>
<Component {...pageProps] />
</ChakraProvider>
);
}
export default MyApp;
ChakraProvider에 theme
을 전달해 줄 수 있음.
extendTheme
함수를 사용해서 커스텀 theme을 만들 수 있다.
import { ChakraProvider, extendTheme } from '@chakraui/react'
const customTheme = extendTheme({
colors: {
brand: {
100: '#ffebee',
200: '#e57373',
300: '#f44336',
400: '#e53935',
}
},
});
function MyApp({ Component, pageProps }) {
return (
<ChakraProvider theme={customTheme}>
<Component {...pageProps} />
</ChakraProvider>
);
}
export default MyApp;
useColorMode
훅을 사용해서 다크모드 등을 쉽게 구현할 수 있음.
반응형 UI를 쉽고 직관적으로 만들 수 있다.
TailwindCSS는 효용을 최우선으로 생각하는 CSS 프레임워크
Chakra UI나 MUI 등 대부분의 UI 프레임워크와 달리 TailwindCSS는 오직 CSS 규칙만 제공한다.
→ 컴포넌트를 제공하지 않으므로 필요한 경우 직접 만들어서 사용해야함.
패키지 설치
$ yarn add D- autoprefixer postcss tailwindcss
테마를 쉽게 구현하기 위한 라이브러리 설치 (선택)
$ yarn add next-themes
TailwindCSS 설정 파일 생성
$ npx tailwindcss init -p
빌드할 때 사용하지 않는 CSS 규칙들을 제거하기 위해 tailwind.config.js를 아래와 같이 수정
module.exports = {
purge: ['./pages/**/*.{js,jsx,ts,tsx}', './components/**/*.{js,jsx,ts,tsx}'],
darkMode: 'class',
theme: {
extend: {},
},
variants: {
extend: {},
},
plugins: [],
};
pages와 components 디렉토리 안의 파일 중 .js .jsx .ts .tsx로 끝나는 파일을 찾은 다음 해당 파일에서 사용하지 않는 CSS를 모두 제거한다.
darkmode 속성값을 ‘class’로 지정한다.
pages/_app.tsx 파일에서 tailwindcss/tailwind.css
를 import한다.
import 'tailwindcss/tailwind.css';
// 생략
next-themes 라이브러리에서 ThemeProvider를 불러와 theme을 적용시킬 수 있다.
darkmode 속성값을 ‘class’로 지정했으므로 ThemeProvider의 attribute를 class로 지정하면 메인 태그에 dark css 클래스를 적용한다.
import { ThemeProvider } from 'next-themes';
import TopBar from * ../components/TopBar';
import 'tailwindcss/tailwind.css';
function MyApp({ Component, pageProps }) {
return (
<ThemeProvider attribute="class">
<div className="dark:bg-gray-900 bg-gray-50 w-full min-h-screen">
<TopBar />
<Component {...pageProps} />
</div>
</ThemeProvider>
);
}
export default MyApp;
이제 TailwindCSS의 CSS 규칙을 적용할 수 있다.
Headless UI는 그 어떤 CSS 클래스나 스타일도 제공하지 않고 동적 컴포넌트만 제공한다.
그래서 TailwindCSS + Headless UI 조합으로 내장 컴포넌트를 쉽게 꾸밀 수 있음.
패키지 설치
$ yarn add @headlessui/react classnames
import { Menu } from '@headlessui/react';
import cs from 'classnames';
필요한 컴포넌트에서 구조분해 할당으로 작은 단위의 컴포넌트를 가져올 수 있다.
const { Button, Items, Item } = Menu;
TailwindCSS와 Headless UI를 함께 사용해서 내장 컴포넌트를 쉽게 구현해볼 수 있다.