Today, What I learned?
ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๊ฐ์ ๊ธฐ์ ์คํ์ ํ๋์ฉ ๋งก์์ ์ด๋ค ์คํ์ ์ ํํ๋ฉด ์ข์์ง ๊ณ ๋ฏผํด ๋ณด๋ ๊ธ์ ์์ฑํด ๋ณด๊ธฐ๋ก ํ๋ค.
๋๋ ์คํ์ผ๋ง๊ณผ ๊ด๋ จํ์ฌ Emotion, Styled-Component, SCSS๋ฅผ ๋น๊ตํด ๋ณด์๋๋ฐ ์ข ๋ค๋ฌ์ด์ ์ฌ๋ ค๋ณธ๋ค.
๐ฅ Emotion vs Styled-components
๐ ๊ธฐ๋ฅ ๋น๊ต
์ ๋ฐ์ ์ผ๋ก ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฅ์ ๊ฑฐ์ ๋น์ทํ๋ค๊ณ ๋ณผ ์ ์๋ค.
์ฐธ๊ณ : https://github.com/jsjoeio/styled-components-vs-emotion
๐ ์ฌ์ฉ ํธ๋ ๋
emotion์ v10์์ v11๋ก ์ ๊ทธ๋ ์ด๋ ๋๋ฉฐ @emotion/core์์ @emotion/react๋ก ํจํค์ง ์ด๋ฆ์ด ๋ณ๊ฒฝ๋์๋ค.
์์ง v10์ ์ด์ฉํ๋ ๊ฐ๋ฐ์๋ค์ด ์๊ธฐ ๋๋ฌธ์ ๋ ํจํค์ง๋ฅผ ํฌํจํ์ฌ Styled-components์์ ์ต๊ทผ ์ฌ์ฉ ํธ๋ ๋๋ฅผ ๋น๊ตํด ๋ณด์๋ค.
์ต๊ทผ styled-components์ ์ฌ์ฉ๋์ด ๊ธ๊ฒฉํ ๋์์ง๋ง emotion์ ๋ ํจํค์ง ์ฌ์ฉ๋์ ๋ํ์ ๋, emotion์ด ๋ค์ด๋ก๋ ์๊ฐ ์ข ๋ ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค!
๐ ๋ฒ๋ค ์ฌ์ด์ฆ์ ํจํค์ง ์์กด์ฑ
๊ทน๋ช ํ ์ฐจ์ด๋ ์์ง๋ง emotion์ ๋นํด styled-components๊ฐ ์ฌ์ด์ฆ๊ฐ ์ข ๋ ํฌ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
ํจํค์ง ์์กด์ฑ ๋ํ styled-components๊ฐ 10๊ฐ, emtion์ 8๊ฐ๋ก ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ๋๋ค.
๐ ํผํฌ๋จผ์ค ์ฐจ์ด
์ฐธ๊ณ ์๋ฃ์ ๋ฐ๋ผ ์์น๋ฝ๋ค์น๋ฝํ๋ ๋ถ๋ถ์ด ์์ง๋ง ์ ์๋ฏธํ ์ ๋๋ก ํฌ๊ฒ ํผํฌ๋จผ์ค์ ์ฐจ์ด๊ฐ ๋์ง๋ ์๋ ๊ฒ ๊ฐ๋ค.
๐styled-components์ ๋น๊ตํ์ฌ emotion ๋ง์ ์ฐจ๋ณ์
๊ทธ๊ฐ์ ํ๋ก์ ํธ์์ styled-components๋ฅผ ๋ง์ด ์ฌ์ฉํด ๋ณด์๊ธฐ์ emotion ๋ง์ ํน์ง์ ์ ๋ฆฌํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
- ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ณด๋ค ์ข ๋ ๊ฐ๋ฐ์ ์นํ์ ์
- styled-components๋ณด๋ค ๋ ์์ ์ฉ๋๊ณผ ์ ์ฐํจ
- css props๋ก ์์กดํ๊ธฐ ๋๋ฌธ์ styled-components๋ณด๋ค ๋ค์ด๋ฐ์ด ๊ฐ๋จํจ
- ๊ฐ์ฒด ์คํ์ผ์ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์์
- SSR์์ ServerStyleSheet ๋ฅผ ์ค์ ํด์ผ ํ๋ styled-components์ ๋ค๋ฅด๊ฒ ๋ณ๋์ ์ค์ ํ์ ์์
SCSS
๐ค ์ ๊น! Sass์ SCSS์ ์ฐจ์ด??
๋ ๋ค CSS ์ ์ฒ๋ฆฌ๊ธฐ๋ผ๋ ๊ณตํต์ ์ด ์์ง๋ง SCSS๋ Sass์์ ํ์๋ ์ธ์ด์ด๊ณ , ๊ฑฐ์ ๋์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค. ๋ฌธ๋ฒ์ ์ผ๋ก ์ฐจ์ด๊ฐ ์กฐ๊ธ ์๋ค๋ ์ !
//Sass ⇒ ์ธ๋ฏธ์ฝ๋ก ์๋ต, indent๋ก ๊ตฌ๋ถ.
.text
font-size: 20px
a
color: #ffffff
// SCSS ⇒ ๊ธฐ์กด์ CSS์ ๊ฑฐ์ ์ ์ฌํจ. ์ค๊ดํธ+์ธ๋ฏธ์ฝ๋ก
.text{
font-size: 20px;
a{
color: #ffffff:
}
}
SCSS๊ฐ CSS์ ์ข ๋ ์ ์ฌํ ๋ฌธ๋ฒ์ ๊ฐ๊ณ ์๊ณ ํธํ์ฑ์ด ๋์ ์ ํธ๋๊ฐ ๋์ ํธ์ด๋ค.
(Sass ๊ณต์๋ฌธ์์ ์ ์๋ SCSS๋ฅผ ์ข ๋ ์ ํธํ๋ค๊ณ ..) [https://sass-guidelin.es/ko/]
SCSS์ ํน์ง
- CSS ์ ์ฒ๋ฆฌ๊ธฐ(CSS preprocessor) : CSS์ ๋ฌธ์ ์ ์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ (๋ณ์, ํจ์, ์ฐ์ฐ์, ์์ ๋ฑ)์ ์ฌ์ฉํ์ฌ ๋ณด์ํจ
- ๊ณตํต ์์๋ฅผ ๋ณ์์ฒ๋ฆฌ ํ๊ฑฐ๋ ๋ฐ๋ณต์ ์ธ ๋ถ๋ถ์ ํจ์๋ก ๋์ฒดํ์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์
- ์ ํ์์ ์ค์ฒฉ(nesting), ์์์ผ๋ก ๊ตฌ์กฐํ๋ ์ฝ๋๋ฅผ ์ ์งํ ์ ์์
- ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ์ ํตํด์ ๋์ ์ผ๋ก CSS ๊ด๋ฆฌ ๊ฐ๋ฅ
- ์ ์ฒ๋ฆฌ๊ธฐ์ด๊ธฐ ๋๋ฌธ์ CSS๋ก์ ์ปดํ์ผ ๋๊ตฌ๊ฐ ํ์ํจ. (.scss → .css)
- ์ปดํ์ผ ์์์๊ฐ ํ์ํจ
์๋๋ ๊ฐ์ธ ํ๋ก์ ํธ์ ์ผ๋ SCSS ์ฝ๋ ์ผ๋ถ์ธ๋ฐ, ์ด๋ฐ ์์ผ๋ก ์ด๋ค๋ ์ฐธ๊ณ ๋ฅผ ์ํด ๊ฐ์ ธ์๋ดค๋ค.
.guide-wrapper {
...
padding: 3rem 4rem 2rem;
background-color: $color-white;
transform: translate3d(100%, 0, 0);
transition: transform 500ms ease-in-out;
&.is-active {
display: block;
transform: translate3d(0, 0, 0);
}
.guide {
&-header {
@include flexbox(between, start);
.btn-close {
width: 32px;
height: 32px;
padding-bottom: 0.4rem;
.ic-close {
font-size: 3rem;
color: $color-gray-400;
}
}
}
&-title {
@include text-style(18);
margin-bottom: 4rem;
font-size: 24px;
color: $color-gray-700;
}
...
}
}
๐ฅ SCSS vs CSS-in-JS
๐ ์ฌ์ฉ ํธ๋ ๋
์ฌ์ฉ์๋ css-in-js์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ชจ๋ ํฉ์ณค์ ๋, Sass์ ๋นํด ์ฌ์ฉ๋์ด ์ข ๋ ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๐css-in-css vs css-in-js
๋ ์คํ์ ๋น๊ตํด ๋ณด๋ ค๋ฉด ๊ฒฐ๊ตญ css-in-css์ css-in-js์ ์ฐจ์ด์ ๋ํด์ ๋ด์ผ ํ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ๋ตํ๊ฒ ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
css-in-css
- CSS Module, CSS ์ ์ฒ๋ฆฌ๊ธฐ(Sass, Less ๋ฑ)
- ๋ณ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ์ด ํ์ ์์ด ๋น ๋ฅธ ์๋
css-in-js
- Styled-components, emotion ๋ฑ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ์๋ฐ์คํฌ๋ฆฝํธ์์ css๋ฅผ ์์ฑํ๋ ๋ฐฉ์
- ์๋ฐ์คํฌ๋ฆฝํธ์ CSS ์ฌ์ด์ ๋ณ์๋ฅผ ๊ณต์ ํ ์ ์์
- ํ์ฌ ์ฌ์ฉ ์ค์ธ ์คํ์ผ๋ง DOM์ ํฌํจ์ํฌ ์ ์์
- CSS-in-CSS์ ๋นํด ๋๋ฆฐ ์๋ (JS→CSS๋ก์ ๋ณํ ํ์)
- ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น๊ฐ ํ์ํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ
์ด๊ฑด Korean FE Article ํ์ ๋ฒ์ญ๊ธ์ธ๋ฐ ์ฝ์ด๋ณผ ๋งํ ์ข์ ์ํฐํด ๊ฐ์ ๋งํฌ๋ฅผ ์ฒจ๋ถํด ๋ณธ๋ค.
(๋ฒ์ญ) ์ฐ๋ฆฌ๊ฐ CSS-in-JS์ ํค์ด์ง๋ ์ด์
๐ ์ ๋ฆฌ
CSS ์คํ์ผ๋ง ๋ฐฉ๋ฒ์ ๋ํด์ ์ด๋ ์ชฝ์ด ๋ ์ข์ผ๋? ๋ ์์ง๊น์ง๋ ์๊ฒฌ์ด ๋ถ๋ถํ ๋งํผ ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์๊ณ ์๋น์ค ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ์ด๋ ์ชฝ์ด ๋ ์ข๋ค!..๋ผ๊ณ ๋ฐ๋ก ๊ฒฐ์ ์ง๊ธฐ๋ ์ด๋ ต๋ค. ๋ค๋ง ์ด๋ฒ์ ์์๋ณด๋ฉฐ ์ฌ๋ฌ ์๋ฃ์ ๊ธ๋ค์ ์ฝ์ด๋ณธ ๊ฒฐ๊ณผ ๋์ฒด๋ก ์ด๋ฐ ์๊ฒฌ๋ค์ ๋ณผ ์ ์์๋ค.
- ๊ฐ๋ฐ์ ํจ์จ์ฑ์ด ์ค์ํ๊ณ ์ปดํฌ๋ํธ ์์ฃผ์ ํ๋ก์ ํธ๋ผ๋ฉด? → CSS-in-JS
- ๋ ๋๋ง ์๋๊ฐ ๋นจ๋ผ์ผ ํ๋ ์ธํฐ๋ํฐ๋ธํ ํ๋ก์ ํธ๋ผ๋ฉด? → CSS-in-CSS
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] input radio, checkbox ์ปค์คํ ํ๊ธฐ with Styled-components (3) | 2023.02.08 |
---|---|
Yarn Berry ์ค์ (0) | 2023.02.07 |
[TypeScript] CRA์์ tsconfig ์ ๋๊ฒฝ๋ก ์ง์ ํ๊ธฐ (0) | 2023.02.03 |
ํฌ๋๋ฆฌ์คํธ Recoil๋ก ๋ฆฌํฉํ ๋ง (0) | 2023.02.02 |
[Next.js] Next.js์ SSG, ISR (0) | 2023.02.01 |
Comment