Tailwind는 맞춤형 디자인을 빠르게 구축하기 위한 유틸리티 퍼스트 CSS 프레임워크입니다.
단독으로 React 앱의 스타일 설정에 사용할 수도 있지만,
Styled Components와도 잘 사용할 수 있습니다.
Tailwind CSS, Styled Components 및 Twin Macro를 사용하여 CSS를 한 줄도 작성하지 않고 form 컴포넌트를 만들어 봅니다.
왜 이 세가지를 동시에 사용하죠?
세팅하기
리액트로 간단한 폼을 만들어 봅니다.
npx create-react-app react-styled-tailwind
├── src
| ├── App.js
| ├── App.test.js
| ├── assets
| | └── tailwind.css
| ├── index.js
| ├── serviceWorker.js
| ├── setupTests.js
| ├── tailwind.config.js
| └── styles
| └── index.js
├── babel.plugin.js
├── package.json
├── postcss.config.js
├── README.md
├── yarn-error.log
└── yarn.lock
의존성을 설치합니다.
yarn add -D tailwindcss twin.macro autoprefixer babel-plugin-macros postcss-cli
yarn add styled-components
Tailwind CSS 설정
구성 파일을 수동으로 추가하거나 다음 명령을 실행하여 새 파일을 생성해야 합니다.
npx tailwind init src/tailwind.config.js
src/tailwind.config.js
module.exports = {
theme: {
extend: {},
},
variants: {},
plugins: [],
}
module.exports = {
plugins: [
require("tailwindcss")("./src/tailwind.config.js"),
require("autoprefixer"),
],
}
이 설정은 postcss.config.js 파일이 컴파일 타임 동안 Tailwind CSS 라이브러리와 tailwind.config.js 파일을 사용하도록 지시합니다. 또한 autoprefixer의 도움으로 접두사가 필요한 속성을 추적합니다.
/babel.plugin.js
module.exports = {
tailwind: {
plugins: ["macros"],
config: "./src/tailwind.config.js",
format: "auto",
},
}
src/assets/tailwind.css
@tailwind base;
@tailwind components;
@tailwind utilities;
import React from "react"
import ReactDOM from "react-dom"
import App from "./App"
import "./assets/styles.css"
import * as serviceWorker from "./serviceWorker"
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById("root")
)
serviceWorker.unregister()
여기에서 CSS 스타일이 포함된 assets/styles.css를 가져옵니다.
기본 스크립트를 약간 조정하여 CSS를 빌드하고 컴파일하는 동안 assets/styles.css 파일에 추가합니다.
/package.json
"scripts": {
"build:css": "postcss src/assets/tailwind.css -o src/assets/styles.css",
"watch:css": "postcss src/assets/tailwind.css -o src/assets/styles.css",
"start": "npm run watch:css & react-scripts start",
"build": "npm run build:css react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
Tailwind CSS and Styled Components
- attrs에 클래스명을 사용합니다.
- 중첩된 프로퍼티에서 Tailwind 클래스를 사용할 수 있도록 twin.macro 라이브러리의 tw를 가져옵니다.
styles/index.js
import styled from "styled-components"
import tw from "twin.macro"
// attrs에 클래스명을 사용한다!
const StyledForm = styled.main.attrs({
className: "flex flex-col h-screen justify-center items-center bg-gray-100",
})`
& {
form {
${tw`bg-white text-center rounded py-8 px-5 shadow max-w-xs`}
}
input {
${tw`border-gray-300 mb-4 w-full border-solid border rounded py-2 px-4`}
}
button {
${tw`bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 border border-blue-700 rounded`}
}
}
`
export default StyledForm
twin.macro 라이브러리는 babel 플러그인 매크로 설정(babel.plugin.js)을 사용하여,
nested selector가 사용하는 Tailwind CSS 유틸리티 클래스를 스타일드 컴포넌트가 이해할 수 있는,
읽을 수 있는 코드로 변환합니다.
아래의 이 예에서 변환이 수행되는 방법을 볼 수 있습니다.
// input
const test = ${tw`text-center bg-red w-full`}
// output
const test = {
background: 'red',
textAlign: 'center',
width: '100%'
}
이제 스타일드 컴포넌트를 App.js 파일에 추가해 보겠습니다.
App.js
import React from "react"
import StyledForm from "./styles"
function App() {
return (
<StyledForm>
<form>
<input type="text" placeholder="Full name" />
<input type="text" placeholder="Email" />
<input type="text" placeholder="Password" />
<button>Sign In</button>
</form>
</StyledForm>
)
}
export default App
결론
주 : 컴포넌트 className을 짧게 가져가면서,
styled-components 사용 시의 장점인 ref를 이용한 인터랙션 구현의 편의성을 동시에 누릴 수 있습니다.
'FrontEnd' 카테고리의 다른 글
useState와 useReducer의 사용사례 (0) | 2022.06.16 |
---|---|
React에서 마진 대신 Spacer 컴포넌트 활용하기 (0) | 2022.06.15 |
React Query에는 Debounce와 Throttling이 없다? (0) | 2022.06.13 |
대규모 프로젝트 React Query 아키텍처 (1) | 2022.06.11 |
리액트 라우터 v6(React Router v6) 딥 다이브 (0) | 2022.06.09 |