์ด RFC๋ v5์์ Material-UI์ ์คํ์ผ๋ง ์๋ฃจ์ ์ ๋ณ๊ฒฝํ๊ธฐ์ํ ์ ์์ ๋๋ค.
TL : DR;
์ด๋ค ์คํ์ผ๋ง ์์ง์ ์ ํํ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํด์ผํฉ๋๋ค.
@material-ui/styles
์ ์ ๊ฐ ๊ธ์ ์ฐ๋ ๋์ ๋ถ๋ถ์ ์ผ๋ก ์ง์ํฉ๋๋ค.๋ค์์ ์ง์ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ค์์ ์ฌ๋ฌ ์ธ๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ์คํ์ผ์ ์ฌ์ฉํ ๋ฒค์น ๋งํฌ์ ๋๋ค (Material-UI v4๋ ์ฑ๋ฅ ์ด
์ฐธ๊ณ ์ฉ PR : https://github.com/mnajdova/react-native-web/pull/1
์ฑ๋ฅ์ ๋ฐ๋ผ JSS (ํ์ฌ @ material-ui / styles๋ก ๋ํ ๋จ), styletron ๋ฐ fela๋ฅผ ์ ๊ฑฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋จ๊ฒ๋ฉ๋๋ค.
๊ณต๊ฐ ๋ ๋ฌธ์ ์ ๋ฐ๋ฅด๋ฉด Aphrodite๋ ๋์ ์ํ์ ์ง์ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค : https://github.com/Khan/aphrodite/issues/141
์ ์๊ฐ์๋ ์ฐ๋ฆฌ์ ์ต์
์์ ๊ทธ ํ๋๋ฅผ ์ญ์ ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
styled-components
์ emotion
๋ ๋ ๋ค ๊ฝค ์ธ๊ธฐ๊ฐ ์์ง๋ง, ๊ทธ ๋น์์๋ react-styletron
๋ ๊ธ์ด ์ฃผ๋น ์ฝ 12500 ํ ๋ค์ด๋ก๋๋ก ํจ์ฌ ๋ค์ณ์ ธ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ ๊ฑฐํด์ผํ๋ ์ด์ , ๋ง์น ์ฐ๋ฆฌ๊ฐ ํจ๊ป ๊ฐ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒ์ฒ๋ผ ์ปค๋ฎค๋ํฐ๋ ๋ค์ ๋ ๊ฐ์ ๋ค๋ฅธ ์คํ์ผ ์์ง์ ์ฑ์ ๊ฐ์ ธ์ผํฉ๋๋ค).
๋ค์์ ์์ฑ ๋น์ ์ฃผ๊ฐ ๋ค์ด๋ก๋ ์์ ๋ฐ๋ผ ์ ๋ ฌ ๋ ๋ชฉ๋ก์ ๋๋ค.
๋ํ์ฑ ์ ๊ฐ์ ์ ์์กดํฉ๋๋ค.
SimilarWeb ์์ ์ธ์ / ์ :
์ค๋ฌธ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด 53.8 %๊ฐ Material-UI ์คํ์ผ (JSS)์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ Material-UI์ ์์ง์ด๊ธฐ ๋๋ฌธ์ ๋๋ผ์ด ์ผ์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ 20.4 %๊ฐ ์ด๋ฏธ ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ณ ์์์ ์ ์ ์์ต๋๋ค. ์ด๋ ์ง์ ์ง์ํ์ง ์๋๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ๋ง์ ์์ ๋๋ค. ์ค๋ฌธ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด ํ์ฌ ๊ฐ๋ฐ์์ ์ฝ 1.9 %๊ฐ ๊ฐ์ ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฌํ ์์น๋ฅผ ๊ฐ์ง๊ณ ์ฐ๋ฆฌ๋ ์คํ์ผ ๊ตฌ์ฑ ์์์ ๋ํ ๋ ๋์ ์ง์์ ์ ๊ณตํ๊ธฐ๋ฅผ ์ํ๋ฏ๋ก ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋๋ค.
์ฌ๋ฌ ์์ง์ ์ง์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋๋ฅผ ์นํธํ๊ณ ํ๋๋ฅผ ๋ฐ๋ชจ์ ๋ฌธ์ํํด์ผํฉ๋๋ค.
styled
API๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ์คํ์ผ์ ๋ค์ ์ง์ ํด์ผํ๋ ๊ฒฝ์ฐ ํญ์ ๋ํผ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๊ฒ๋จ์ ์๋ฏธํฉ๋๋ค.์ฌ๋ด ์ด๋ํฐ๋ฅผ ์ ๊ณตํ์ฌ ์ฌ๋ฌ CSS-in-JS ์๋ฃจ์ ์ ์ง์ํ ์ ์์ต๋๋ค. ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ์ ์คํ์ผ๊ฐ์ ๊ตฌ๋ฌธ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์คํ์ผ์ ๋ํ ์ค๋ณต ์์ ์ด์์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค (์คํ์ผ ๊ตฌ์ฑ ์์ / ๊ฐ์ ์ ๋นํด ์ต์ํ jss). ์ด๋ค ์๋ฃจ์ ์ ์ ํํ๋ ํ ๋ง ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉ ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ํ ๋ ๊ด์ฌ ๋ ์ง์์ styled
์์ ๋น๋กฏ ๋ ์ ์์ต๋๋ค. ์ฌ๋๋ค์ด ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ์นํฉ ๊ตฌ์ฑ์ ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค-(์ด๊ฒ์ ๊ณ ๋ คํ ์ฌํญ์
๋๋ค).
ํด๋์ค์ ๋ชจ์๊ณผ ๊ฐ๋ฐ์๊ฐ์ด๋ฅผ ๋์์ผ๋กํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จํ์ฌ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ์๋ก์ด ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์๋ ๋ฐฉ๋ฒ์ ๋น๊ตํ๊ณ ์ถ์ต๋๋ค.
์๋ฅผ ๋ค์ด Slider ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ํ์ฌ ์์ฑ ๋ DOM์ ๋ชจ์ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ ํด๋์ค๋ ๋งค์ฐ ์ ์ค๋ช ํ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ ์ฌ๋๋ค์ ์ด๋ฌํ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ ์ฌ์ ์ ํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด ๊ฐ์ , ์คํ์ผ ๊ตฌ์ฑ ์์ ๋๋ ๊ธฐํ ์ ์ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๋์ค ์ด๋ฆ์ผ๋ก ์ผ๋ถ ํด์๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๊ฐ๋ฐ์์๊ฒ ํด๋์ค๋ฅผ ๋์์ผ๋กํ๋ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ๊ฐ ๊ตฌ์ฑ ์์๋ ์ํ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ๋์์ผ๋ก ์ง์ ํ ์์๋ ํด๋์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ด๊ฒ์ ๊ฐ์ ์ ์ํด ์์ฑ ๋ ํด๋์ค๋ฅผ ์ ์ธํ๊ณ ๊ฐ ๊ตฌ์ฑ ์์๊ฐ MuiSlider-root
& MuiSlider-colorPrimary
์ ๊ฐ์ด ์ด์ ์ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๋ฅผ ๊ณ์ ๊ฐ๊ฒ๋๋ฉฐ, ์ ์ผํ ์ฐจ์ด์ ์์ด ํด๋์ค๊ฐ ์ด์ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ ์ ์ํ๋ ๋์ ์์ํ๊ฒ ์ ํ๊ธฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ํํฌ์ฒ๋ผ ๊ตฌํ ๋ ์ ์์ต๋๋ค -useSliderClasses
์ด๋ค ์๋ฃจ์
์ ์ ํํ๋ ๋ ์ค ๋ ๊ฐ์ง๊ฐ ์ง์ํ๋ styled
API๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ผ๋ก ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ด ์ง์ ๋์ง ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ์ฝ๊ฒ ์ง์ํ ์ ์์ต๋๋ค (์๋ง๋ preact ์ฌ์ฉ๊ณผ ๊ฐ์ ์นํฉ ๋ณ์นญ ์ฌ์ฉ).
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๋ ๊ฐ์ง ์ต์ ์ ์กฐ์ฌํ ํ ํต์ฌ ํ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฑ์ผ๋ก ๊ฐ ๊ฒ์ ์ ์ํฉ๋๋ค . ๋ช ๊ฐ์ง ํต์ฌ ์์ :
์ด๋ฏธ ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ๊ฑฐ์ ๋ ธ๋ ฅ์์ด ๊ฐ์ ์ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค.
๊ฐ์ ์์ cx + css๋ฅผ ์ง์ํ๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ๋ํผ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ ์คํ์ผ ์ฌ์ ์๋ฅผ ์ถ๊ฐํ๋ ๋์์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ด ์ฃผ์ ์ ๋ํด ๋ ๊น์ด ์กฐ์ฌํด ์ฃผ์ @ryancogswell ์๊ฒ @emotion ์ ์ฝ๋์์ ๋์ ๋ชจ๋๊ฐ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์ฐ๋ ค๋ฅผ์ฃผ๋ ์ด๋ค ๊ฒ๋ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๊ฐ์ ์ ๊ธ๋ก๋ฒ ๊ตฌ์ฑ ์์์ ๋น๊ตํ๊ธฐ ์ํด ์คํ์ผ ๊ตฌ์ฑ ์์์์ createGlobalStyle
๋ ์กฐ์ฌํ์ต๋๋ค. ๋ ๋๋งํ๋ ๋์ ๋๋ถ๋ถ์ ์์
์ ์ํํ๊ณ (Strict / Concurrent ๋ชจ๋์์๋ ๋ณธ์ง์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์์) useEffect๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฆฌ ๊ธฐ๋ฅ์์ ์คํ์ผ์ ์ ๊ฑฐํฉ๋๋ค. createGlobalStyle์ ๋์ ๋ชจ๋์์ ์ฌ์ฉํ๊ธฐ ์ ์ ์์ ํ ์ฌ ์์ฑ์ด ํ์ํฉ๋๋ค. ๋ ๋๋ง์ด ์ปค๋ฐ๋์ง ์์ ๊ฒฝ์ฐ ๋ ๋๋ง ์ค์ ์คํ์ผ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค. ๋๊ตฐ๊ฐ ์ง๋ ๋ฌ์ ๋ช ๊ฐ์ง ์ถ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ฌ ๋ค์ ์์ฑํ๋ ค๊ณ ์๋ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์์ด ์งํ ์ํฉ์ ๋ฐ๋ผ์ผํฉ๋๋ค.
Emotion์ ๋ฌธ์๋ ์ฌ๋ฌ ํด๋์ค ์ด๋ฆ์ ์คํ์ผ์ ํ์ฉํ๋ ๋์ CSS๋ฅผ ๋จ์ผ ํด๋์ค๋ก ๊ตฌ์ฑ ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. v5์์๋ ๊ธฐ์กด ์ ์ญ ํด๋์ค ์ด๋ฆ์ด ์คํ์ผ์ด ์ฒจ๋ถ๋์ง ์์ ์ฑ ์ ์ฉ๋ฉ๋๋ค. ๊ฐ์ ์คํ์ผ ๊ตฌ์ฑ ์์์ ๊ตฌ์ฑ์ ์คํ์ผ์ ๋จ์ผ ํด๋์ค๋ก ์๋ ๊ฒฐํฉํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ๋ชจ๋ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ด ๋จ์ผ ํด๋์ค ์ด๋ฆ : +1 :์ ์ํด ๊ตฌ๋๋๊ธฐ ๋๋ฌธ์ ์ ์ด๋ Material-UI์์ ์ ์ํ ์คํ์ผ ๋ด๋ถ์ ์ด๋ฌํ ์คํ์ผ ์ํธ ์์ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ ์ญ ํด๋์ค ์ด๋ฆ (๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์ ์ง์ ์ ์ํด ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋์์ ์ง์ ) ํ ๋ค์ ๋ชจ๋ CSS ์์ค๋ฅผ ํตํฉํ๋ ์์ ๋น ํ๋์ ์์ฑ ๋ (๊ฐ์ ์ ์ํด) ํด๋์ค ์ด๋ฆ์ ๊ฐ๊ฒ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ตฌ์ฑ ์์์ ๋ฐ๋ผ ๊ฐ์ ์ ์ํด ํน์ด์ฑ์ด ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ฐ์ ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ์ง์
(๋ ๋๋ง ์๊ฐ ๋๋ ์ ์ ์๊ฐ ์ปดํฌ์ง์
)์ ์์์ ๋ํด ๋จ์ผ ํด๋์ค๊ฐ๋ฉ๋๋ค.
์คํ์ผ ๊ตฌ์ฑ ์์๋ ๋ ๋๋ง ์๊ฐ ๊ตฌ์ฑ๊ณผ ๊ด๋ จํ์ฌ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์์ต๋๋ค (์ ์ ์๊ฐ ๊ตฌ์ฑ์ ๋จ์ผ ํด๋์ค๋ก ๊ฒฐํฉ ๋จ). ์คํ์ผ ๊ตฌ์ฑ ์์์ ๋์ผํ ๊ตฌ์ฑ์ผ๋ก ์ธํด ๋์ผํ ์์์ ์ฌ๋ฌ ํด๋์ค๊ฐ ์ ์ฉ๋๊ณ ํน์ ์ฑ์ด ๋ด๊ฐ ์๋ ํ๋๋ก ์๋ํ์ง ์์ต๋๋ค.
๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
๋ช ๊ฐ์ง ์์ ์ฌํญ :
React ์ปค๋ฎค๋ํฐ๋ ๋๊ท๋ชจ๋ก JSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋ํ์ต๋๋ค.
๋์ React ์ปค๋ฎค๋ํฐ๊ฐ _for_ JSS์ ํฌํํ์ง ์์๋ค๊ณ ์ ์ํฉ๋๋ค. ์๋ง๋ ๋ค๋ฅธ ์๋ฃจ์ ๋งํผ "๋ง์ผํ "๋์ง ์์์๊น์?
์ฐ๋ฆฌ๋ ์ฌ๋ฐ๋ฅธ ๋ง์ ๋ฒ ํ ํ์ง ์์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ ์ผํ ๋ง์ ๋ด๊ธฐ๋ฅผ ๊ฑธ์์ต๋๋ค โ ๊ทธ๊ฒ์ ํ ๊ฒฝ๋ง์์ต๋๋ค. ๋น์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ ์๋ฃจ์ ์ ๋ชจ๋ ์์๋ฅผ ์ ํํ์ง ์์์ต๋๋ค.
๊ฐ์ ์ ํ๋ฅญํ๊ฒ ๋ค๋ฆฝ๋๋ค! UI ๋๋ ์คํ์ผ๋ง ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ๋ ์๋ ์์ฑ ๋ฐ CSS-in-JS๋ฅผ ์ฌ์ฉํ ํ์ดํ์ ๋ชจ๋ ์ด์ ๊ณผ ๊ฐ์ TS ์ง์์๋ฐ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ์ฌ์ ํ ๊ฐ๋ฅํ ๊น์?
๋ง์ง๋ง ๋นํธ๊ฐ ๋๋ฅผ ์ก์์ต๋๋ค! ๋ฒ ํ ํ๋๊ทธ ๋ค์์ด ์์ ์ ์ํํ๊ฑฐ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ์ฌ ๋๊ณ ์ถ์ต๋๋ค.
๊ฐ์ ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ์ง์ (๋ ๋๋ง ์๊ฐ ๋๋ ์ ์ ์๊ฐ ์ปดํฌ์ง์ )์ ์์์ ๋ํด ๋จ์ผ ํด๋์ค๊ฐ๋ฉ๋๋ค.
์คํ์ผ ๊ตฌ์ฑ ์์๋ ๋ ๋๋ง ์๊ฐ ๊ตฌ์ฑ๊ณผ ๊ด๋ จํ์ฌ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์์ต๋๋ค (์ ์ ์๊ฐ ๊ตฌ์ฑ์ ๋จ์ผ ํด๋์ค๋ก ๊ฒฐํฉ ๋จ).
๋๋ ๋ํ ํ ๋ง ๊ฐ์ฒด๊ฐ ๋์ผํ๊ฒ ์ ์ง ๋ ๊ฒ์์ ์ธ๊ธํ์ต๋๋ค. ์ ์๊ฐ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ํ ๋ง๋กํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค! ๋๋ ๋ ํ ๋ง์ด ์๋ค : ๊ฒฝ์ :
M-UI์ ๋ํ ํ๋ฅญํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ํ๋ก์ ํธ๊ฐ ์งํ๋๋ ๋ฐฉํฅ์ ์ข์ํฉ๋๋ค.
๋ณด๋ค ํ์คํ ๋ ์คํ์ผ๋ง ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ๋๋ ํ๊ณผ ์ปค๋ฎค๋ํฐ๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ฉฐ v5๋ ์๋ฆฌ๋ก ๋ ๋ฉ์ง ๊ฒ์ ๋๋ค! :๋ก์ผ:
์คํ์ผ ๊ตฌ์ฑ ์์์ ๊ฐ์ ์ ๋ชจ๋ ์ฌ์ฉํ๋ ์ฌ๋์ผ๋ก์ ๋๋ ๊ทธ๋ค ์ฌ์ด์ ์ ํ์ด ์ฝ๊ณ ๊ณ ํต์ค๋ฝ์ง ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
+ ๊ฐ์ ์ด ๋ ํ์ดํ ์คํฌ๋ฆฝํธ ์นํ์ ์
Emotion์ ๋ฉ์ธํ ์ด๋๋ก ๋งํ๊ธฐ-์ด๊ฒ์ ํ๋ฅญํ๊ฒ ๋ค๋ฆฝ๋๋ค ๐
์ฐ๋ฆฌ๋ ๋ํ ์ด๋ค ํ๋ช ๋ ์์ ์๋ก์ด ๋ฉ์ด์ ๋ฅผ ๊ณง ์ถ์ ํ ์ ์์ด์ผํฉ๋๋ค. ์ผ๋ถ ์ ๋ฆฌ, ์ ๋ฐ์ ์ธ ๊ฐ์ , ๋ด๋ถ ํํฌ ๋ฐ TS ์ ํ ๊ฐ์ (๋ ๋์ ์ถ๋ก ๋ฐ ์ฑ๋ฅ) ๋ง ์์ต๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ์ฌ ์์ฑ๋ ํ์! Emotion ๋ฐ Styled-Components์ ์ผ๋ถ ๊ฐ์ฅ์๋ฆฌ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค (ํ์ฌ ๋ ๋ค ๋์ผํ ํ์๋ฅผ ์ฌ์ฉํ๊ณ ์์). ๋ ์๊ณ ๋น ๋ฆ ๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ๊ฒฝ์ฐ ์ด๋ค ์ต์ ์ด ๋ ๋ง์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง (์๋ ๊ฒฝ์ฐ)๋ฅผ ๋์ ํฉ๋๊น?
์ฐจ์ด๊ฐ ์๋์ง ํ์คํ์ง ์์ง๋ง ๊ฐ์ ๋ฐ / ๋๋ ์คํ์ผ ๊ตฌ์ฑ ์์์ ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ฒค์น ๋งํฌ๋ฅผ ์ํ ํ์ต๋๊น? ๊ทธ๋ค์ ์ฌ๋ฌผ์ ๋ ์ต์ ํํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
MUI๊ฐ ์ด์ ์ ์คํ์ผ์ด ์ ์ฉ๋๋ค๊ณ ํ์ ํ์ผ๋ฏ๋ก ๋๋ผ์ด ์ผ์ ๋๋ค. ๋๋ ๊ฐ์ ์ด ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์๊ฐํ์ง๋ง, ํ์ฌ ์คํ์ผ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ๋ ๋ง์์ง์ ๋ฐ๋ผ ๊ทธ๋ค์ด ๊ฐ์ ์ผ๋ก ์ฎ๊ธฐ๊ณ ์ถ์ง ์๋ค๋ฉด ์ข์ ์ต์ ์ ์ค ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค
@ ee0pdt ๊ฐ์ ์ ์คํ์ผ๊ณผ ๋งค์ฐ ํก์ฌํฉ๋๋ค. ์ด๊ฒ์ด ์คํ์ผ ๊ตฌ์ฑ ์์๋ณด๋ค Emotion์ ๋ํ ์ ์ฒด ์ ํ์ ์ผ๋ถ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ถ๋ช ํ ์ด์ ์ด ์์ผ๋ฉฐ ์ด์ฃผ ๋ถ์ฑ๋ ๊ฑฐ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์์๊ฒ ์ ํ๊ถ์ ๋ถ์ฌํ์ฌ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ง์ํ๋ ๊ฒ์ ๋ํ ์ ์ฒด ์น์ ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ฐ ๊ธธ์ด ๋ ์ ์์ง๋ง ๋ค์ ํ ๋ฒ ํ์คํ๋ ๋ฏธ๋์ ๋ ๋ง์ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์์ ํ ๋์์ฑ๊ณผ ๋ํผ ๊ตฌ์ฑ ์์๊ฐ ์๋ค๋ ๊ฒ์ ์ ์๊ฒ ๊ฑฐ๋ ์ฐจ๋จ๊ธฐ์ ๋๋ค. ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์คํ์ผ์ด์๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ํ ์๋ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ, ๊ทธ๊ฒ์ ๊ณ ๋ คํด์ผํฉ๋๋ค. ์ฐจ๋ผ๋ฆฌ ํ์คํ๋ฅผ ์ถ์งํ๊ณ ์ถ์ต๋๋ค
styletron-react๊ฐ ๋ฐฐ์ ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ณ ๋ ค๋์ง ์์ ์ ์ฒด ๋ฉํธ๋ฆญ, ์ฆ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ ์ ์ธ๋ฉ๋๋ค. ๊ธฐ๋ณธ styletron ์์ง (๋ฐ fela)์ ์์์ ๋๋ค. ์กฐ๊ธ ๋๋ฆฌ์ง ๋ง ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํฉ๋๋ค. ๋ง์ ๋ฐ์ ํ์ด์ง๊ฐ ์๋ฌด๊ฒ๋ํ์ง ์๊ณ ์ ์ ํ> 1GB๊ฐ๋๋ ๊ฒ์ ๋ณด์์ ๋ ์ฝ๊ฐ์ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ๊ทธ ํ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ ์ถฅ๋ ๋ค.
์์ ํ๋ ์ ์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์์ "ํด๋์ค"๊ฐ ์บ์๋จ์ ๋ฐ๋ผ ๊ตฌ์ฑ ์์ ์ ๋ฐ์์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ํ ์คํธ์๋ ๋ฐ์๋์ง ์์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
SSR์ ์ง์ํ๋ ํ ๋ง์กฑ
sweat_smile : ๋ ๊ทธ๋ฅ ์๋ ์คํ์ผ ๊ตฌ์ฑ ์์์ ๋ฌธ์ ์์ ๋ด ํฌํ ์ฒ ํ - ์ฒซ๋ฒ์งธ ์ด์ผ๊ธฐ ์ฑ
์ ํตํด ๊ฐ์ ์ ์๊ณ ๋ฐฐ์ ์ต๋๋ค,ํ์ง๋ง It will mean that all components styles need to be created using the styled API, which means for developers they will always have wrapper components if they need to re-style.
์ค์์น์ ์ ๋ฅผ ์ป์๋ค.
๋น ๋ฅธ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ค์์ ์ผ๋ถ ์๊ฒฌ / ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ๊ฒฝ์ฐ ์ด๋ค ์ต์ ์ด ๋ ๋ง์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง (์๋ ๊ฒฝ์ฐ)๋ฅผ ๋์ ํฉ๋๊น?
styled-components
๋ emotion
์ฌ์ฉํ๋ @ sag1v ๋ ์ฒ๋ฆฌํด์ผ ํ ๋ ๋ง๊ฑฐ๋ ์ ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์
ํ์ง ์์ต๋๋ค. ์ ๋ฐ์ ์ธ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํ
๋ง ๋ด๋ถ์ ์ฌ์ ์๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง์ ๊ดํ ๊ฒ์
๋๋ค.
// previosly
root: {
contained: {
'&$disabled': { // <-- this part will need to be transformed
color: 'red',
},
},
containedPrimary: {
color: 'blue',
},
}
// after
root: {
contained: {
'&.Mui-disabled': {
color: 'red',
},
},
}
๊ทธ๋ฌ๋ emotion
์ styled-components
์ฌ์ด์ ์คํ์ผ ๊ตฌ๋ฌธ์ด ๋์ผํ๋ฏ๋ก ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์ฐจ์ด๊ฐ ์๋์ง ํ์คํ์ง ์์ง๋ง ๊ฐ์ ๋ฐ / ๋๋ ์คํ์ผ ๊ตฌ์ฑ ์์์ ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ฒค์น ๋งํฌ๋ฅผ ์ํ ํ์ต๋๊น? ๊ทธ๋ค์ ์ฌ๋ฌผ์ ๋ ์ต์ ํํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
@ hc-codersatlas nope,ํ์ง๋ง perfs๋ ์ด์จ๋ ์์ ๋ช ๊ฐ ์ฌ์ด์ ์์ผ๋ฏ๋ก ์ด๋ค ์ฐจ์ด๋ ๋ง๋ค์ง ์์ ๊ฒ์ ๋๋ค. ํ๋ ์ข์ ์ ํ!
styletron-react๊ฐ ๋ฐฐ์ ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ณ ๋ ค๋์ง ์์ ์ ์ฒด ๋ฉํธ๋ฆญ, ์ฆ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ ์ ์ธ๋ฉ๋๋ค. ๊ธฐ๋ณธ styletron ์์ง (๋ฐ fela)์ ์์์ ๋๋ค. ์กฐ๊ธ ๋๋ฆฌ์ง ๋ง ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํฉ๋๋ค. ๋ง์ ๋ฐ์ ํ์ด์ง๊ฐ ์๋ฌด๊ฒ๋ํ์ง ์๊ณ ์ ์ ํ> 1GB๊ฐ๋๋ ๊ฒ์ ๋ณด์์ ๋ ์ฝ๊ฐ์ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ๊ทธ ํ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ ์ถฅ๋ ๋ค.
์์ ํ๋ ์ ์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์์ "ํด๋์ค"๊ฐ ์บ์๋จ์ ๋ฐ๋ผ ๊ตฌ์ฑ ์์ ์ ๋ฐ์์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ํ ์คํธ์๋ ๋ฐ์๋์ง ์์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
styletron-react
์ด ์ ์ธ ๋ ์ด์ ์ ๋ํ ๋ด ์๊ฒฌ์ ์ฝ๊ฐ ์คํด์ ์์ง๊ฐ์์ ์ ์์ผ๋ฉฐ, PR ์ค๋ช
์ด ์ฆ์ ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์ฑ๋ฅ์ ์ข์ง๋ง styletron์ ๋ํ ๊ฐ์ฅ ํฐ ๊ด์ฌ์ฌ๋ ์ปค๋ฎค๋ํฐ์
๋๋ค. https://www.npmtrends.com/styletron-react-vs-@emotion/core -vs-styled-components ๊ฐ์ ๋ฐ ์คํ์ผ ๊ตฌ์ฑ ์์ ์ง๋ 6 ๊ฐ์ ๋์ 2000000 ํ ์ด์ ๋ค์ด๋ก๋๋์์ผ๋ฉฐ styletron์ ์ฝ 15000 ํ์
๋๋ค.
๋ํ ๊ฐ ํด๋์ค ์ด๋ฆ์๋ ์คํ์ผ๋ฌ ๊ท์น์ด ํ๋๋ง ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์์ ์ CSS๋ ์ฌ์ ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
๋ชจ๋ ํ์ผ ์์ ์ฝ๋ ์๋์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ฐ์ ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ์ง๋ฌธ์ด ์์ต๋๋ค.
/ ** @jsx jsx * /
์ด๊ฒ์ JSX pragma์ด๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก JSX pragma๋ React.createElement์ ๋๋ค.
๊ฐ์ ์์ css
์์ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ถ๊ฐํด์ผํฉ๋๋ค. styled
API์ ์ผ๋ฐ className API์๋ ํ์ํ์ง ์์ต๋๋ค.
JSX pragma ์ถ๊ฐ๋ฅผ ๊ฑด๋ ๋ธ ์ ์์ง๋ง ์ถ๊ฐ Babel ์ค์ ์ด ํ์ํ๋ฉฐ ๋๊ตฌ์์ ๋ ๋์ ์ง์์ด ์ ๊ณต๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด TS๋ JSX pragma๋ฅผ ์ฌ์ฉํ ๋์ฒ๋ผ ์ ํํ๊ฒ CSS prop์ ์ ํ ๊ฒ์ฌ ํ ์ ์์ต๋๋ค. ์์ธํ ์ ๋ณด๋ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค : https://github.com/emotion-js/emotion/pull/1941/files#diff -9abe25e5d2b00958d4b9849f5f20c139R5
@mnajdova ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํนํ styletron์ ๋ํ ๋ณด์ฆ ์ด์์ผ๋ก ๋ค๋ฃจ์ด์ง๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค. ๋ค์ด๋ก๋ ๋๋ ์ปค๋ฎค๋ํฐ์ ๊ดํ์ฌ- "๋จ์ง"Uber๋ styletron์ ์ฌ์ฉํ๋ฏ๋ก ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค. ์ ์ด์ ๊ฐ์ ์ ์ํด ํฌํํ์ต๋๋ค.
์ ์ ์คํ์ผ์ ์ค์ CSS ํด๋์ค๋ก ๋ณํ ํ ์์๋ babel ํ๋ฌ๊ทธ์ธ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ด ์๋ค๋ฉด ๋ฉ์ง ๊ฒ์
๋๋ค. compiled
๋ผ๋ ์ ์ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ฏธ ์์ต๋๋ค. ํ์ค์ ์ผ๋ก ๋๋ถ๋ถ์ ์คํ์ผ์ ์ ์ ์
๋๋ค.
Fela๋ฅผ ์ ์ฉํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด fela-plugin-rtl
, fela-plugin-prefixer
์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ ์ธํธ๊ฐ ํ์ํ๋ฏ๋ก ์ฑ๋ฅ์ด ๋ ๋๋น ์ง ๊ฒ์
๋๋ค (https://github.com/microsoft/fluentui/pull/12289) ๐ข ๊ทธ๋ฆฌ๊ณ ๋๋ก๋ Fela๋ณด๋ค ๋ ๋ฐฐ ๋น ๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ Emotion (https://github.com/microsoft/fluentui/pull/13547)์ผ๋ก ๋๋ ๊ฒ์
๋๋ค ๐ฆ
๋ด ์ ์ผํ ๊ด์ฌ์ฌ๋ ๊ฐ์ ์์ css
๋ฌผ๊ฑด์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ๋ด ๊ฒฝํ์ ๋น์ถ์ด ๋ณผ ๋ ํฐ ์ํ ์ ํธ์
๋๋ค. ํฐ ์ฝ๋๋ฒ ์ด์ค์์ ๊ทธ๋ฐ ๊ฒ์ ์ ๊ฑฐํด์ผํ๊ณ ์ฌ๋ฏธ๊ฐ ์์์ต๋๋ค. ์? ์ฅ๊ธฐ์ ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ ์ค๋ ์ถ์ํ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ styled
ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ผ๋ถ ํด๋์ค๋ฅผ ์์ฑํ๋ ๋ฐ makeStyles
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋งค์ฐ ๋ง์กฑํฉ๋๋ค.
๋ฐ๋ผ๊ฑด๋,์ด ๋ API์ ๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ผ๋ฉฐ css
๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ง ์์๋๋ฉ๋๋ค.
๋ด ์ ์ผํ ๊ด์ฌ์ฌ๋ Emotion์ CSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
@yordis ๋ถ๋ช
ํ css
์ํ์ ์ฌ์ฉํ์ง ์์๋๋ฉ๋๋ค. makeStyles
๋ฐ withStyles
์ฌ์ฉ์ ๋ํด ์ด๋ ์ ๋ ๋ณ๊ฒฝ์ด์์ ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ํ์ํ ๋ณ๊ฒฝ์ ์์ ๋๋ถ๋ถ ์์
ํ์ codemod๋ก ์ ํ ๋ ์ ์์ต๋๋ค. makeStyles
๋๋ withStyles
์์ ์ฌ์ฉ ๋ ์ ๊ทผ ๋ฐฉ์์ด ๊ฐ์ ์ฌ์ฉ์ ์ง์ํ๋ ๋ฐ ์ค์ฉ์ ์ด์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ์ด๋ฌํ API์ ๋ํ ์ง์์ ์ธ ์ง์์ ๋ณ๋์ ํจํค์ง๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค ( " @ material-ui / core "๋ ๋ ์ด์ JSS ์ข
์์ฑ์ ๊ฐ์ง ์์ต๋๋ค.) v5๊ฐ ์ถ์ ๋ ํ ์ต์ํ์ ์ ์ง ๋ณด์ ๋ง๋ฐ์ ์ ์์ต๋๋ค ( makeStyles
๋ฐ withStyles
๋ฐ์ํ๋ ์ํฉ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ์ ํด์ง์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๊ฐ์ ์ผ๋ก ์ ์งํ๋ ๊ฒ์ ์๋ฏธ์ ๋ํ ๋์ ์ถ์ธก ์ผ๋ฟ์
๋๋ค).
๐ ๊ฐ์ ์ ์ฌ์ฉํ๊ธฐ์ํ ์ ํ. ๋ฐฉ์ง styled
์ API styled-components
์ฐ๋ฆฌ ํ์ด ๊ฐ์ ์ ์ ํํ ์ด์ ์ค ํ๋ (๋ํ ์ ์ฌํ ์ง์ styled
๋ฟ๋ง ์๋๋ผ API๋ css
์ํ). ์ฐ๋ฆฌ๋ ํ์ฌ ๋จธํฐ๋ฆฌ์ผ UI ์คํ์ผ ์ปค์คํฐ๋ง์ด์ฆ์ Emotion์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ฝค ์ ์๋ํฉ๋๋ค. ๋ด์ฅ ๋ ์ง์์ ์ผ์ดํฌ ์์ ์ฅ์์ด ๋ ๊ฒ์
๋๋ค.
์ด๋ฌํ ์ฌ์ค๊ณผ ๊ด๋ จํ์ฌ :
๋ง์ ๊ฐ๋ฐ์๊ฐ ์คํ์ผ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ Material-UI์ ์คํ์ผ์ ์ฌ์ ์ํฉ๋๋ค. ์ต์ข ์ฌ์ฉ์๋ ๋ฒ๋ค์ ๋ ๊ฐ์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
๋์ ๋ชจ๋ ์ง์
์คํ์ผ ๊ตฌ์ฑ ์์ : ๋ถ๋ถ
์คํ์ผ ๊ตฌ์ฑ ์์๊ฐ ๋์ ๋ชจ๋๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๋ค๋ฉด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์คํ์ผ ๊ตฌ์ฑ ์์ (JSS ์ ์ธ)๋ก MUI๋ฅผ ์ฌ์ ์ํ๊ณ ์์ผ๋ฏ๋ก ๋ ํฉ๋ฆฌ์ ์ธ ์ ํ์ด ๋ ๊น์? ๋ฒ๋ค ํฌ๊ธฐ์์ ๊ฐ์ ์ด ์๋ค๋ ์ ์ 2 ๊ฐ์ css-in-js ์๋ฃจ์ ์ด ํฌํจ๋์ด์ผํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ MUI์ ๋๋ถ๋ถ์ ์ค์ฉ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์คํ์ผ์ ์ฌ์ ์ํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์ ๋ด ํ์ด Emotion์ ๊ตฌ์ฑ ์์ ์คํ์ผ๋ง์ ์ฃผ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กด์ฌํ๋ ๋น ํจ์จ์ฑ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ๋ค์ด ์๋์ ์ค๋ช ๋ ์ด๋ฌํ ๋น ํจ์จ์ฑ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๊ถ๊ธํฉ๋๋ค.
Emotion StyledComponent ์๋๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
const StyledComponent = styled.div`
${({color}) => color && `color: ${color}`};
display: flex;
justify-content: center;
align-items: center;
background: teal;
font-size: 20px;
padding-top: 8px;
padding-bottom: 8px;
margin-top: 12px;
margin-bottom: 12px;
border: 1px solid grey;
`
์์ ์ํ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ CSS ์ํ ( display: flex, justify-content, ..., border: 1px soild grey
)์ด ๋ณต์ฌ ๋ ์ CSS ํด๋์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ ์์ ์ํ์ ๋ํด ์ ํํ ๋์ผํ CSS ์ํ์ ๊ฐ์ง CSS ํด๋์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ์๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฐ๋ฆฌ๊ฐ ๋ฐ๊ฒฌ ํ ๋ ๋ค๋ฅธ ๋น ํจ์จ์ฑ์ StyledComponent
์์์ ์ ๊ตฌ์ฑ ์์๊ฐ ํ์ ๋ ๋ ๊ธฐ๋ณธ StyledComponent
์์ ๋ณต์ฌ ๋ ๋ชจ๋ css props๋ก ์ ํด๋์ค๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์
๋๋ค. ์๋๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
const DerivedComponent = styled(StyledComponent)`
font-family: monospace;
`
StyledComponent
์์ ์์ฑ ๋ ์์ CSS ํด๋์ค์ font-family: monospace
๋ง ์ถ๊ฐํ๋ ๋ ๋ค๋ฅธ CSS ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ฆ, ์๋์์ ๋ณผ ์ ์๋ฏ์ด StyledComponent
์์ ๋ณต์ฌ ๋ ๋ชจ๋ props๊ฐ์๋ CSS๋ฅผ ์์ฑํฉ๋๋ค.
์ด์ StyledComponent
๋ฐ DerivedComponent
์์ StyledComponent
ํจ๊ป ์ฌ์ฉํ๋ฉด (์ฒ์์) css props๊ฐ ์ค๋ณต ๋ ๋ ๊ฐ์ css ํด๋์ค๊ฐ ์์ต๋๋ค (font-family์์๋ง ๋ค๋ฆ). ์๋์์ ๋ณผ ์ ์๋ฏ์ด;
๋น์ ์ด ์์ํ ์ ์๋ฏ์ด, ์๋ก ์ค๋ณต๋๋ CSS props๋ฅผ ๊ฐ์ง ๋ง์ CSS ํด๋์ค๋ค์ ๊ฝค ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์์ต๋๋ค.
Emotion์ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฑ ์์ ์คํ์ผ์ด ํจ๊ป ๊ตฌ์ฑ๋จ์ ๋ฐ๋ผ ์ค๋ณต ๋ CSS ์ํ์ด ๋ง์ CSS ํด๋์ค๋ก ๋๋ฉ๋๋ค.
๊ฐ css ํด๋์ค์์ด css props๊ฐ ์ฑ์ ๋์ ๋๋ ์ํฅ์ ๋ฏธ์น๋์ง ํ์คํ์ง ์์ง๋ง ๊ฐ์ ์ฌ์ฉ์ ์ ํํ ๋ ์ด๊ฒ์ด ๊ณ ๋ ค๋๋์ง ๊ถ๊ธํฉ๋๋ค.
๋ฐํ์์ CSSStyle์ ๋ง๋ค๊ณ ์ ์ฉ ํ ๋ Emotion์ ์ฑ๋ฅ์ ์๋ฌธ์ ์ ๊ธฐํ์ง ์์ต๋๋ค. ๊ฐ์ ์ ์ฑ๋ฅ ํ
์คํธ์์ ๋ถ๋ช
ํ ๊ฒ์ฒ๋ผ CSS ์คํ์ผ์ ์ ์ฉ ํ ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค.
CSSstyle์ด ๋ถํ์ด ์ค๋ฅด๋ ๊ฒ์ด ๊ฑฑ์ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Emotion์ SSR (ed)์ด ๋ ์ ์์ผ๋ฏ๋ก ์คํ์ผ์ด HTML์ ์ธ๋ผ์ธ๋จ์ ์๋ฏธํ๋ฏ๋ก ๋ถํ์ํ๊ฒ (css ์คํ์ผ ํ๊ทธ๋ก) HTML ํ์ผ์ด ์ปค์ง ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์ ๋ถํ์ํ CSS ์ํ์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ ํ ๋ ๋ง์ ํ๊ทธ๊ฐ ์์ฑ๋ฉ๋๋ค.
์คํ์ผ ๊ตฌ์ฑ ์์๊ฐ ๋์ ๋ชจ๋๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๋ค๋ฉด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์คํ์ผ ๊ตฌ์ฑ ์์ (JSS ์ ์ธ)๋ก MUI๋ฅผ ์ฌ์ ์ํ๊ณ ์์ผ๋ฏ๋ก ๋ ํฉ๋ฆฌ์ ์ธ ์ ํ์ด ๋ ๊น์? ๋ฒ๋ค ํฌ๊ธฐ์์ ๊ฐ์ ์ด ์๋ค๋ ์ ์ 2 ๊ฐ์ css-in-js ์๋ฃจ์ ์ด ํฌํจ๋์ด์ผํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ MUI์ ๋๋ถ๋ถ์ ์ค์ฉ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์คํ์ผ์ ์ฌ์ ์ํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@petermikitsh ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ์ ๋ํด ๊ฒฐ๋ก ์ ๋ด๋ฆฐ ์ด์ ๋ ์ค์ ๋ก ๊ฒฐ๋ก ์ ๋ค ๊ฐ์ง ์์ ์ ๋๋ค
์ฒซ ๋ฒ์งธ ์ ์ ์ผ๋์๋๋ฉด ๊ฐ๋ฐ์๊ฐ ๋ฒ๋ค์ ๋ ๊ฐ์ css-in-js ์๋ฃจ์
์ ํฌํจํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ ๊ฐ์ ์ผ๋ก ์ด๋ํ๋ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์
๋น์ฉ์ด ๋งค์ฐ ์ ๊ณ styled
์ด์ธ์ ๋ค๋ฅธ API๋ฅผ ์ง์ํฉ๋๋ค.
@ ko-toss์ด ๊ธ์ ์จ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฐ์ ์ด ๋ชจ๋ ์คํ์ผ๋ก ํ๋์ className์ ์์ฑํ๋ค๋ ์ฌ์ค์ ์ฌ์ ์๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ ๋์ ์์ง์ด๋ฉ๋๋ค. ์ฌ๋ฌ ๊ฐ์ className์ ์์ฑ ํ ๋ ๋ฐ์ํ ์์๋ ๋ฌธ์ ๋ ๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ํด๋์ค๊ฐ ์ด๊ธธ ๊ฒ์ด๋ฉฐ, ์ด๋ ํฅํ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ๋ชจ๋ CSS ๊ท์น์ด ํ ๋ฒ๋ง ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์๋น์์ ํจ์ฌ ๋ ๋์ ์์ CSS๋ฅผ ์ฌ์ฉํ๊ณ ์์์ง๋ง ์์ธก ๊ฐ๋ฅํ ์ฌ์ ์๋ฅผ ์ํํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ์ด์ ์ ๋ชจ๋ ์คํ์ผ์ ์ฒ๋ฆฌํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ๋ณํฉํ์ง ์์ผ๋ฉด ๊ฒฐ๊ตญ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๋ฐ๋ฉด์, ์ด๋ค CSS-in-js ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๋ฌด์์๋ก ๋ฌดํํ ์คํ์ผ ์กฐํฉ์ ๋ง๋ค์ง ์๊ณ ์ฌ์ ํ ์ํ ๊ฐ์ ๋ฐ๋ผ ๊ฝค ๊ตฌ์กฐํ๋์ด ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ ์ญ์ ์ฐ๋ฆฌ๊ฐ ์ผ๋์ ๋ ์ข์ ์ ์ ๋๋ค. ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
- ๊ทธ๋ฐ์?
[stylex] ์์ด๋์ด ํธํ์ฑ์ ์ด๋ป์ต๋๊น ([style9] ๋ฑ)
(์ด๊ฒ์ ์คํ๋ ค ์ฐธ๊ณ ๋ก, ๊ฐ์ ์ ์ข์ ์ ํ์ ๋๋ค)
https://github.com/cristianbote/goober (1kB, ๊ฐ์ ๋ณด๋ค ์ฝ๊ฐ ๋ ๋์ ์ฑ๋ฅ)
์์ง ๊ฒฝํ์ด ์์ง๋ง ์ธ์ ๊ฐ ํด๋ณด๊ณ ์ถ์ด์.
@cztomsik https://github.com/kuldeepkeshwar/filbert-js ์ ์ ์ฌํ์ง๋ง JavaScript ๊ตฌ๋ฌธ ์ง์์ด ์์ต๋๋ค (CSS ํ ํ๋ฆฟ ๋ฌธ์์ด ๋ง ํด๋น).
๋ค์์ ์ํธ ์์ฉ ์๊ฐ์ Google Lighthouse๋ก ์ํ ํ ๋ช ๊ฐ์ง ํ ์คํธ์ ๋๋ค.
์ฐธ๊ณ ๋ก ๋ฐ๋๋ผ API, css props API ๋ฐ ์คํ์ผ API๋ฅผ ์ฌ์ฉํ์ฌ ์คํ์ผ ๊ตฌ์ฑ ์์ v5, ๊ฐ์ v10 ๋ฐ ๊ฐ์ v11์ ๋ํ ์์ธํ ๋ฒค์น ๋งํฌ๋ฅผ ์ํํ์ต๋๋ค. ์ด๊ฒ์ด ํ ๋ก ์ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
์์ ์ CSS์ ํ์ดํ ์คํฌ๋ฆฝํธ ์ง์์ ํฌ๊ฒ ์์กดํ๋ ์๋ก์ด css-in-js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ๋ ค ํ์ จ๋์?
์์ ์ CSS์ ํ์ดํ ์คํฌ๋ฆฝํธ ์ง์์ ํฌ๊ฒ ์์กดํ๋ ์๋ก์ด css-in-js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ๋ ค ํ์ จ๋์?
๋ฒค์น ๋งํฌ๋ ์๋์ง๋ง ํ์ฌ๋ ๊ฐ์ ๋ณด๋ค 2 ~ 4 ๋ฐฐ ๋๋ฆฌ๋ค. ๋๋ Otion์ด ์ค์ ๋ก ๊ฝค ํฐ ์ ์ฌ๋ ฅ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ๊ณ ์ต์ ํ์ ์ฌ์ง๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง Otion์ ์์ง ์์ฐ ์ค๋น๊ฐ๋์ง ์์์ต๋๋ค.
๊ทธ๋๋ ์์ง ๋ฐ๋์ ํ ์คํธํ์ง ์์์ต๋๋ค. ๐
์ค์ ์ ๋ก ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ป์ต๋๊น? ๋๋ ์๋ฌด๋ linaria๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ ๋ณด์ง
๋๋ ์ด๋ ์์ ์์ ๋ฆฌ๋ ๋ฆฌ์๋ฅผ ์ฐ์ฐํ ๋ง๋ฌ๊ณ ์ ๋ง ์ข์ํฉ๋๋ค. ๋์ ์ ์ผํ ๊ฑฑ์ ์ ์ญํ ์ํ ์คํ์ผ์ ์ ์ ์ผ๋ก CSS๋ฅผ ๋ณ์์ ๋ฐ๋ผ, ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ฐ์ผ๋ก IE (11)์ ๋ํ ์ง์์ด๋์ง ์๋ ๊ฒ์
๋๋ค https://github.com/callstack/linaria/issues/445 ๋์ ๋นํด styled-components
๋ฐ emotion
ํ์ฌ ์ปค๋ฎค๋ํฐ๋ ํจ์ฌ ์์ต๋๋ค.
์๋
ํ์ธ์.
Linaria๋ ๊ต์ฅํฉ๋๋ค.
์ ๋๋ก ์ค์ ํ๋ฉด css-in-js (๊ฐ๋ฐ ๊ฒฝํ ์ธก๋ฉด์์)์ ์์ CSS (์์ CSS ์ฑ๋ฅ์ ์ด๊ธธ ์ ์์) ๋ชจ๋์์ ์ต๊ณ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. CSS ๊ท์น์ ์ต์ ํ (์ค๋ณต)ํ๊ณ ์ฌ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ linaria๋ ์ด๋ณด์์๊ฒ๋ ์ด๋ ค์ธ ์์๋ ๋น๋ ๋ฐ ๋ฒ๋ค๋ง ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
์ ์ฌํ API ํ๋ฉด (์ : filbert-js / goober)์ด ์๋ ๋ค๋ฅธ css-in-js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํฌํธ๋ฅผ๋ณด๊ณ ์ถ์ต๋๋ค.
@kuldeepkeshwar ์คํ์ผ API์ ๋ํ ์ด๋ํฐ๋ฅผ ์ดํด๋ณด๋ฉด ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค. :)
https://compiledcssinjs.com/ ์์ด ๋ชจ๋ ๊ฒ์ ์ด๋ป๊ฒ ๋ถํฉํฉ๋๊น? ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ์ ๊ทผ ๋ฐฉ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. Compiled๋ ๋ํ ํ๋ก์ ํธ๋ฅผ ์ํด RFC๋ฅผ ์คํํ๋ฏ๋ก ์คํ ์์ค ๋ฐ ๊ณต๋ ์์ ์ ์ ํฉํฉ๋๋ค. _์ํฌ ์ํฌ_
์น ์คํ์ผ๋ง์ ๋ฏธ๋๋ ๋งค์ฐ ๋ฐ๋ค๊ณ ์๊ฐํ๋ฉฐ Material-UI๊ฐ ๋ชจ๋ ์ฑ ์คํ์ผ๋ง ์๋ฃจ์ ์ ํ์ ์์๊ฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Compiled์ ์๋ ๋ฐฉ์์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ฌํ ์ข ๋ฅ์ ๋ณํ์ ํตํด ์ฐ๋ฆฌ๋ ๋๊ตฌ๋ฅผ ๊ตฌ์ฑ / ์ค์ ํ ํ์์์ด ๋ชจ๋ ์๋น์์๊ฒ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ๋งํ๋ฉด๋ฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋ ฅํ๊ณ ๋ ์ค์ํ ๊ฒ์ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ฌ CSS๊ฐ ์๋ํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
_CSS๋ ๋ฐํ์์ ์์ฑ ํ ์ ์์ต๋๋ค ._
์ด ๋จ์ผ ์ ์ฝ์ ์ฐ๋ฆฌ์๊ฒ ๋ง์ ๋ฌธ์ ์ด์ด์ค๋๋ค. ๋น๋ ์๊ฐ ์ต์ ํ. ๋ฐํ์ ๋ณด์ฅ. ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ์ฌ๋ผ์ก์ต๋๋ค.
๋ค๋ฅธ ์ธก๋ฉด์์ ์ ๋ ์ธ๊ธฐ๊ฐ ์ข์ ํ๋ก์ ํธ์ ํฐ ์๋ฏธ๊ฐ ์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ๋๋ MUI์ ์ง๊ธ๊น์ง ๊ทธ ์์ ๋ค์ด๊ฐ ์์
์ ์ข์ํฉ๋๋ค. ํ๋ฆฌ๋ฏธ์ ์ ํ์ด ๋ ๊ฒ๋ ํ์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ธ๊ธฐ๋ฅผ ์ํด '์ธ๊ธฐ์๋'_name_์ ์ ํํ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ธ ์ฃผ์ฅ์ด ์๋๋๋ค.
๋๋ ์ธ๊ธฐ๊ฐ ์ฌ๋ฌ ๋ฒ ์ธ๊ธ๋๋ ๊ฒ์ ๋ณด์๊ณ , x์ ์ฌ๋๋ค์ด x ๊ธฐ์ ์ ์ฌ์ฉํ๋์ง ๊ณ ๋ คํด๋ ๋งค์ฐ ์ซ์ดํฉ๋๋ค. MUI๋ (๋ด ์ฑ
์์) ์ฑ๋ฅ, DX ๋ฐ ๊ธฐํ ๊ฒ๋ค์ ์ด์ ์ ๋ง์ถ๊ณ ์ธ๊ธฐ๊ฐ ์๋๋๋ค.
MUI๋ ํญ์ 6 ๋ง๊ฐ์ ๋ณ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์๋ ์์ต๋๋ค. ์ธ๊ธฐ์๋ ๊ธฐ์ ์ ์ ํํ๊ธฐ ๋๋ฌธ์ด ์๋๋ผ ์ต๊ณ ์ ๊ธฐ์ ์ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋์ค ํฌํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํํ๋ ๊ฒ์ด๋ณด๋ค ๊ด๋ฒ์ํ๊ฒ ์ ๊ทผํ๊ธฐ ์ฌ์ด ํ๋ก์ ํธ์ ๊ด๋ จ์ด์๋ ๊ฒฝ์ฐ, ๊ทธ๊ฒ์ ์ฑ๋ฅ ํฅ์์ด ์๋ ๋น์ฆ๋์ค ๋ฌธ์ ์ ๋๋ค. ํ๋ก์ ํธ๋ ์ฌ์ฉ์ ์ ๋ฌด์ ๊ด๊ณ์์ด ์กด์ฌํฉ๋๋ค. ๋์ ์ ํ์ผ๋ก ์ฃฝ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํด ๋๋ฌด ๋ง์ ์๋ด์ด ์๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ "๊ทธ๊ฒ์ ์ถฉ๋ถํ ๋์ค์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋์ ์ ํ์ด๋ค"๋ฅผ ์ฝ๋ ๊ฒ์ ๋ง์ ํฐ ์ข ์๋ฆฌ๋ฅผ ์ธ๋ฆฐ๋ค.
์ฌ๋๋ค์ ์ธ๊ธฐ์๋ ๊ธฐ์ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด ์๋๋ผ ์ข์ ์ ํ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ฌ์ฉํฉ๋๋ค. MUI๋ ํ๋ ํ์ ์์ฅ ์ด์์ง๋ง CSS-in-JS๊ฐ ์์์์๋ ์ ๋ช ํด์ก์ผ๋ฉฐ ์ธ๊ธฐ ํฌํ btw๋ฅผ ์ป์ง ๋ชปํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๋ช ๊ฐ์ง ๋๋ผ์ด ์์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ํ์ฌ ์ปค๋ฎค๋ํฐ๊ฐ ์๋ ์ค์ DX ๋ฐ ์ฑ๋ฅ์ ๊ธฐ๋ฐํ ์ฌ๋ฐ๋ฅธ ์ ํ์ํ์ต๋๋ค.
๊ทธ ์ฌ์ด๋ ๋ ธํธ๊ฐ ์ฃผ๋ชฉ ๋ฐ๊ณ ์๋๋ฐ, ๋๋ ๋๋ ๋์ค ํฌํ์ ํธ์ ์์๋ค. ๊ทธ๋์ ์ ๋ ์ ์์ ์ ๋ฐฉํดํ๊ณ ์์ต๋๋ค. ๋๋ ๋ ์ธ๊ธฐ์๋ ์ ํ์ ์ ํํจ์ผ๋ก์จ ์ป์ ์์๋ ๊ฐ์ธ์ ์ธ ์ด๋์ด ์์ต๋๋ค. ํ๋ช ๊ณผ ๋ณํ์ ๋ํด ์ด์ผ๊ธฐ ํ ๋ ์ธ๊ธฐ๋ฅผ ์ ํ ๊ณ ๋ คํด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ์ต์ ์ค ์ผ๋ถ๋ ์ฌ๋๋ค์ด ์ต์ ์ ํ์ฌ ์ธ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ด ์๋๋ผ ์ค์ ๋ก ๋ฌด์์ธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์ค์ ๋ก ๋๋ด๊ธฐ ์ํด MUI์ ๋ค์ด๊ฐ๋ ๋ชจ๋ ์๊ฐ๊ณผ ์๊ฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ์ง๋ ๋ช ๋ ๋์ ๋ชจ๋ ํ์ค ๋ฑ์ ๋ฐ๋ฅด๋ ๋๋ผ์ด (์ฌํ๊ฒ๋ ์ฌ์ ์ธ) ์๋ฃจ์ ์ ๋ง๋ค์์ต๋๋ค. ํผ์์ ๋ง๋๋ ๋ฐ ๋ช ๋ฌ ๋๋ ๋ช ๋ ์ด ๊ฑธ๋ ธ์ ๊ฒ์ ๋๋ค! ๊ฐ์ฌ๋ฅผ ์ข ์ด์ ๋น์น ๋งํผ ์ถฉ๋ถํ ์ค๋ช ํ ์ ์์ต๋๋ค ๐โโ๏ธ ๐ ๐โโ๏ธ
Compiled๊ฐ ์ต์ ์ธ์ง ์ฌ๋ถ์ ์ด๋ํฐ ๋ฑ์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ Compiled ์ ๊ทผ ๋ฐฉ์์ ์๊ฐํฉ๋๋ค.
Compiled๋ ์ฝ๋๋ฅผ ์ ์ ์ผ๋ก ๋ถ์ ํ ๋ค์ ์ปดํ์ผ ๋ ๊ตฌ์ฑ ์์๋ก ๋ณํํ์ฌ ๋น๋์ JS์์ CSS๋ฅผ ์ปดํ์ผํฉ๋๋ค. ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ด JavaScript ๋ฒ๋ค์ ํฌํจ๋์ด ์์ต๋๋ค.
์ ์ฒด ์ปดํ์ผ 'CSS at runtime'์ ์ฝ ์กฐ๊ฑด์ ๊ณ ๋ คํ ๋ ๊ณ ๋ คํ ๊ฒฝ๋ก์ ๋๋ค.
๋๋ ์ด๊ฒ์ Emotion ์ ์ง ๊ด๋ฆฌ์๋ก์ ๋งํ๊ณ ์๋ค-Compiled๋ ํ๋ฅญํ๋ค. ๋๋ ์คํ๋ ค ๋ฏธ๋์์์ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ์ผ์ด์ง๋ง ์์ง ์คํ ์ด๊ธฐ ๋จ๊ณ์ ๋๋ค. ๋๋ MUI๊ฐ์ด ์์ ์์ ๊ทธ๊ฒ๊ณผ ํจ๊ป ๊ฐ ์ ์์์ง ๋งค์ฐ ์์ฌ ์ค๋ฝ๋ค.
๋ด๊ฐ ํ๋ ธ์ง ๋ง ์ปดํ์ผ๋๋ฉด ์ฌ์ฉ์ ์ ์ ์คํ์ผ์ ์ฌ์ฉํ์ง ์๊ณ ๋ MUI์ ๋ํ ๊ตฌ์ฑ ํ์ผ์ด ์์ด์ผ ํจ์ ์๋ฏธํ๋ ๊ตฌ์ฑ์ด ์์์ ์๋ฏธํฉ๋๋ค.
MUI๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ตฌ์ฑ์ ๋ง๋ค๋๋ก ๊ฐ์ ๋ฐ๊ณ ์ถ์ง ์์ต๋๋ค. ์ฐธ๊ณ ๋ก Create React App๊ณผ ๊ฐ์ ๋ ๋จ์ ์ธ ๋ถํธ ์คํธ ๋ํผ์์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ต์ง ์์๊น์?
@Andarist ๋๋ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ํ์ ์ ์์ํ๊ฑฐ๋ ์ ์ด๋ ๋์๊ด ๊ฐ๋ฐ์ ์ฐธ์ฌํ๋ ๊ฒ์ ๊ณ ๋ คํ ๊ฒ์ ์ ์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ฏธ๋์ ์ด๋๋ก ์ด์ด์ง์ง ๊ถ๊ธํฉ๋๋ค! : eyes : ๋๋ ๋น์ ์ด ๋งํ๋ฏ์ด ์ปดํ์ผ ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด ๋ฏธ๋์ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ ๋ง์ ์ฌ๋๋ค์ด ํจ๊ป ๋ชจ์ฌ ๋๋ผ์ด ๊ฒ์ ๋ง๋๋ ๊ฒ์ ๋ฉ์ง ๊ฒ์ ๋๋ค.
@shilangyu ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น ์ ์๊ธฐ ๋๋ฌธ์ ๋น์ ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋์ ๋๋ ๋จ์ง ์ปดํ์ผ ์ ์ฒซ
์ ๋ก ๊ตฌ์ฑ ํ์ค๋ก ๋ง์ด๊ทธ๋ ์ด์
์ฐ๋ฆฌ๊ฐ ์ข์ํ๋ API๋ ๋ชจ๋ ์ฌ๊ธฐ์ ์์ต๋๋ค-CSS prop ๋ฐ ํด๋์ค ์ด๋ฆ ๊ตฌ์ฑ ์์๋ ์์ต๋๋ค! ์๋น์๋ ๋ฒ ๋ค๋ฌ๋ฅผ ๊ตฌ์ฑ ํ ํ์๊ฐ์๋ ์ ๋ก ๊ตฌ์ฑ ์คํ ๋ฆฌ๋ฅผ ๊ณ์ํ๋ฉด์ ๊ตฌ์ฑ ์์๋ฅผ ์๋นํ๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ ํ์๋์๊ณ ์๋ฒ ์ธก ๋ ๋๋ง์ ์ํด ํน์ ํญ๋ชฉ์ ์ค์ ํ ํ์๋ ์์ต๋๋ค. ๊ทธ๋ฅ ์๋ํฉ๋๋ค.
์์์ผ๋ฟ
์ค๋ ๋ฐ๋ก ์ ๋ก ๊ตฌ์ฑ์ ํตํด ๋ด์ผ์ ๋ชจ์ต์ ์์ง ์๊ณ ์์ต๋๋ค. ์ ํ์ CSS ์ถ์ถ, CSS๋ฅผ Atomic ํ์์ผ๋ก ๋ณํ, ์ฌ์ง์ด ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์์ ๋ถ์์ ์ํด CSS ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์์๋ ๊ฐ๋ฅ์ฑ์ ํตํด ์ฐ๋ฆฌ๋ ํฅ๋ฏธ๋ก์ด ๋ด์ผ์ ์๊ฐํ๊ณ ์์ต๋๋ค.
์๋
ํ์ธ์.
https://compiledcssinjs.com/์ ํ์ด ๋ณด์์ต๋๋ค. ์ฌ์ ํ ๋ฐํ์ css-in-js ์๋๊ฐ์?
๋น๋์ CSS ํด๋์ค๋ฅผ ์์ฑํ์ง๋ง ๋ฐํ์์ <CC>...</CC>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์คํ์ผ (๋น๋์ ์์ฑ ๋ CSS ํด๋์ค๋ก ์คํ์ผ ํ๊ทธ ์์ฑ)์ ์ ์ฉํฉ๋๋ค.
์์ํ CSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ง ํผ ๋น ๋ฅด๋ค๋ฉด ์ค์ ๋ก๋ ๋ฏธ๋์
๋๋ค (css ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฏ๋ก). ๊ณต์ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค
๊ฐ์ ์ ๋นํด ์ผ๋ง๋ ๋น ๋ฅธ์ง ๊ถ๊ธํฉ๋๋ค.
์ค์ ์ ๋ก ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ป์ต๋๊น? ๋๋ ๋ฆฌ๋ ๋ฆฌ์๋ฅผ ์ธ๊ธํ๋ ์ฌ๋์ ๋ณธ ์ ์ด ์์ต๋๋ค.
์๊ตฌ ์ฌํญ์ ํฌํจํ์ง ์์ ๊ฒ์ Material-UI ์๋น์์ ๊ด์ ์์ ๋ชจ๋ ์๋ฃจ์ ์ด ์ ๋ก ๊ตฌ์ฑ์ด์ด์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ์ ๋ก ๋ฐํ์ ์๋ฃจ์ ์ ์ดํดํ๋ค๋ฉด ์ปดํ์ผ ํ์์ CSS๋ฅผ ์์ฑํฉ๋๋ค. ๋ฒ ๋ค๋ฌ๊ฐ ์ ๋๋ก ํฌํจ๋๋๋ก ์ค์ ํ์ง ์์๋ ๋๋์?
๋ฐ๋ผ์ ์ ๋ก ๋ฐํ์์ด ์๋ง๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๋ฃจ์ ์ผ ์ ์์ง๋ง ์ถ๊ฐ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์ ๋ก ๋ฐํ์์ผ๋ก ์คํ๋๋๋ก ๊ตฌ์ฑ ํ ์์๋ ์ ๋ก ๊ตฌ์ฑ ์๋ฃจ์ ์ ๊ฐ๋ ๊ฒ์ด ์ด์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ์ ๋ก ๋ฐํ์์ด ์๋ง๋ ๊ฐ์ฅ ๋น ๋ฅธ ์๋ฃจ์ ์ผ ์ ์์ง๋ง ์ถ๊ฐ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์ ๋ก ๋ฐํ์์ผ๋ก ์คํ๋๋๋ก ๊ตฌ์ฑ ํ ์์๋ ์ ๋ก ๊ตฌ์ฑ ์๋ฃจ์ ์ ๊ฐ๋ ๊ฒ์ด ์ด์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ค์ ๋ก Compiled์ ํ์ฌ ์ํ์ ๋ํด ๋งํ ์๋ ์์ง๋ง ์ ์ง ๊ด๋ฆฌ์์ ์ฌ๋ฌ ๋ฒ ์ด์ผ๊ธฐํ๊ณ ์์์ผ๋ฉฐ ์ด๊ฒ์ ๋๋ต์ ์ธ ๊ณํ์ ๋๋ค. ์์ด๋์ด๋ Emotion & Styled Components API์ ๋ํ ์ง์์ ์ ์งํ๋ ๊ฒ์ด๋ฏ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋ณํ ํ๋ฌ๊ทธ์ธ ๋๋ ์นํฉ ๋ก๋๋ฅผ ํฌํจํฉ๋๋ค. ํ์คํ ์์ฑ ๋ ์์๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ์ง๋ ์์ง๋ง (JS๋ ์์ผ๋ํฉ๋๋ค), ํ๋ช ํ๊ฒ ์์ฑ๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ๋ฌด์ธ๊ฐ๋ฅผ ์ปดํ์ผ ํ ์ ์๋ค๋ฉด. ๊ทธ๊ฒ์ ๋จ์ํ ๋์ง ๊ฒ์ ๋๋ค-๊ทธ๊ฒ์ ์ฌ์ฉํ๊ฑฐ๋ ์ ์ ๋ถ์์ ๋๊ธฐ ์ํด ์ฝ๋์ ํน์ ๋ถ๋ถ์ ๋ค์ ์์ฑํ๋๋ก ๊ฐ์ ํฉ๋๋ค.
์์ฝํ์๋ฉด-0config Emotion (๋๋ Styled Components)์ ์ฌ์ฉํ๋ฉด Compiled๋ฅผ ํฅํ ์ ํ์ ์ต์ ํ๋ก ์ ์ฉ ํ ์ ์์ด์ผํฉ๋๋ค (ํ๋ก์ ํธ๊ฐ ์ฝ์ ํ ๊ฒ์ ์ ๊ณต ํ ์์๋ ๊ฒฝ์ฐ).
@ ko-toss ๋น๋ ํ์์ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ก ์ปดํ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐํ์์ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ด ์ ์ ํ ์์น๋ก ์ด๋๋ฉ๋๋ค.
์น ํ์ด์ง์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ด JavaScript ๋ฒ๋ค์ ํฌํจ๋์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ทํ์ ์ด๊ธฐ ์ฝ๋๋ฅผ ๋ชจ๋ ์๊ด์ผ๋ก ๋ฐ์๋ค์ ๋๋ค.
import { styled } from '@compiled/css-in-js';
export const ColoredText = styled.span`
color: #ff5630;
`;
๊ทธ๋ฐ ๋ค์ ์ปดํ์ผ ๋ ๊ตฌ์ฑ ์์๋ก ๋ณํํฉ๋๋ค.
...
...
๊ทธ๋ฌ๋ฉด ๋ฐํ์์ ์คํ์ผ์ด ๋ฌธ์์ ํค๋๋ก ์ด๋ํฉ๋๋ค.
์ด๋ฌํ ์ข ๋ฅ์ ๋ณํ์ ํตํด ์ฐ๋ฆฌ๋ ๋๊ตฌ๋ฅผ ๊ตฌ์ฑ / ์ค์ ํ ํ์์์ด ๋ชจ๋ ์๋น์์๊ฒ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ๋งํ๋ฉด๋ฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋ ฅํ๊ณ ๋ ์ค์ํ ๊ฒ์ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ฌ CSS๊ฐ ์๋ํ๋ ๊ฒ๊ณผ ์ ํํ ๋์ผํฉ๋๋ค.
CSS๋ ๋ฐํ์์ ์์ฑ ํ ์ ์์ต๋๋ค.
์ ๋ก ๋ฐํ์์ผ๋ก ์คํ๋๋๋ก ๊ตฌ์ฑ ํ ์์๋ ์ ๋ก ๊ตฌ์ฑ ์๋ฃจ์ ์ ๊ฐ๋ ๊ฒ์ด ์ด์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋จธ๋ฆฌ์ ๋ชป์ ๋ฐ์ ๊ฒ ๊ฐ์์. ๊ฐ์๊ธฐ ๊ทธ ๊ฟ์ ์ข์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ ํ ํผ์
ํ๊ตฌ ํ ๋ช ๊ฐ์ง ์์ด๋์ด๊ฐ ์๊ณ ์ด์ฉ๋ฉด ํ๋ ฅํด์ผ ํ ๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ฝ๋์ ๊ฐ๋ ์ค ์ผ๋ถ๋ ๋์๊ฒ ์ฝ๊ฐ ์ด์ง์ ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ์ธ๋ถ ์ฌํญ์ ์ค๋ช ํ ์์น๊ฐ ์๋๋๋ค. ๋ค์์ ์ ๊ฐ ๊ธฐ๋ํ๋ ๋ช ๊ฐ์ง ์ฌํญ์ ๋๋ค.
IE11 ์ง์๊ณผ ๊ด๋ จํ์ฌ ํต๊ณ๋ฅผ ์ด๋ป๊ฒ๋ณด๊ณ ์์ต๋๊น? ๋๋ ๊ทธ๊ฒ์ด ์๋ฒฝํ๊ฒ ์คํ ๊ฐ๋ฅํ ์ผ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. Edge๋ ์ด์ ํฌ๋กฌ์ ๊ธฐ๋ฐ์ผ๋กํ๋ฉฐ, ๋๋ถ๋ถ์ ๊ธฐ์ ์ ๊ฐ OS IE11์ด ์ค์น๋ ์ง์์ฃผ๊ธฐ๊ฐ ๋๋ ๋ MS๊ฐ ๋ง์นจ๋ด IE์ ๋ํ ์ง์์ ์ค์ง ํ ๋ ์ ํํด์ผํฉ๋๋ค. ์ค์ ๋ก ๊ธด์ฃผ๊ธฐ์ด์ง๋ง, ๋ฉ์ธํ ์ด๋๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์งํ๋ ์ญํ ์ํ๊ณ ์์ผ๋ฉฐ ๋ณธ์ง์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๋ ํญ๋ชฉ์ ๋ํ ์ง์์ ์ ์งํ๋ฉด ์ฌ๋๋ค์ด '์ํํธ'๊ฐ ์ค์ ๋ก ์ผ์ด๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
IE11์ ์ง์ํ์ง ์๋ ์ต์ ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ ์ด์ ์ ๊ณ ํ์ค์ด ์๋๋ฉฐ, ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์๊ฐ ๋ฌธ์ ์ด๋ฉฐ MUI์ ๊ฐ์ ๋๋ผ์ด ๊ธฐ๋ฅ์ _default_ ์ง์์ ์๋ง๋ ๋ณํ๋ฅผ ๋ฐฉํด ํ ๊ฒ์ ๋๋ค.
IE11์ ์ง์ํ์ง ์๋ ์ต์ ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ด์ ๋ํด์๋ https://github.com/mui-org/material-ui/issues/14420 ์ ์ฐธ์กฐ
IE์ ๋ํ ์ง์์ ์์ ํ ์ค๋จ ํ ๊ณํ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ๋ฒ์ ์ v5์์ IE 11์ ๋์์ผ๋กํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์์ง๋ง IE 11์์ ์ ํ ์๋ํ์ง ์๋ ์๋ฃจ์ ์ ์ ํํ ์ ์๊ฑฐ๋ ๋น๋์ ๊ต์ฒด ํ ์์๋ ์๋ฃจ์ ์ด์ด์ผํฉ๋๋ค. ์ฐ์ถ.
์ด๊ฒ์ ๋๋ฅผ ํ๋ณตํ๊ฒํ๋ค.
๊ธฐ์กด jss๋ฅผ ์คํ์ผ / ๊ฐ์ ์ผ๋ก ๋ณํํ๋ ์ฝ๋ ๋ชจ๋๊ฐ ์์ต๋๊น?
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ. ์ ๋์ด ํ ๋ก ์ ์ฐธ์ฌํ ๊ธฐํ๋ฅผ ์ก์์ต๋๋ค.
ํ์ฌ ๋ฒ์ ์์ ๋จธํฐ๋ฆฌ์ผ UI๋ ๋ด๋ถ์ ์ผ๋ก makeStyles
์ฌ์ฉํ๋ ๋์ ์คํ์ผ (props์ ์์กดํ๋ ํจ์ ์ธ ์คํ์ผ)์์ด withStyles
HOC๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. makeStyles
(๋์ ์ํ ์์)์ ์ฑ๋ฅ์ ์๋นํ ๋๋๊ณ Material UI๊ฐ ๋ถํ์ํ ๋ํผ๋ฅผ ์์ฑํ๋ withStyles
๋์ ์ง์ ์ฌ์ฉํ๋ฉด ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค.
์ด ๋ฒค์น ๋งํฌ๋ฅผ ๋ถ๊ธฐ
์นด๋ 100 ์ฅ :
makeStyles
: https://csb-5z6e2-lh4u8acll.vercel.app/?cases=mui-make-styles&cards=100emotion
: https://csb-5z6e2-lh4u8acll.vercel.app/?cases=emotion-styled&cards=100styled-components
: https://csb-5z6e2-lh4u8acll.vercel.app/?cases=styled-components&cards=100์นด๋ 500 ์ฅ :
makeStyles
: https://csb-5z6e2-lh4u8acll.vercel.app/?cases=mui-make-styles&cards=500emotion
: https://csb-5z6e2-lh4u8acll.vercel.app/?cases=emotion-styled&cards=500styled-components
: https://csb-5z6e2-lh4u8acll.vercel.app/?cases=styled-components&cards=5002500 ์ฅ์ ๊ฒฝ์ฐ :
makeStyles
: https://csb-5z6e2-fqtfkzcrk.vercel.app/?cases=mui-make-styles&cards=2500emotion
: https://csb-5z6e2-fqtfkzcrk.vercel.app/?cases=emotion-styled&cards=2500styled-components
: https://csb-5z6e2-fqtfkzcrk.vercel.app/?cases=styled-components&cards=2500์ ๋ฐ์ ์ผ๋ก emotion
๋ฐ styled-components
์ฑ๋ฅ์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ makeStyles
๋ ๋ง์ดํธ์ ์ ์ฒด์ ์ผ๋ก 2-4 ๋ฐฐ ๋ ๋น ๋ฅธ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ์
๋ฐ์ดํธ๋ฅผ ์ํด 6-8x
๋ ๋น ๋ฅด๊ฒ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
ํนํ ์ฐ๋ฆฌ๊ฐ ํด๋ํฐ๊ณผ ๊ฐ์ ์ ์ ๋ ฅ ์ฅ์น์์ ๋ ๋๋ง ํ ๋ ๊ทธ ์ฐจ์ด๋ ์ถฉ๋ถํ ํฝ๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ๋จธํฐ๋ฆฌ์ผ ๋ง์ด๊ทธ๋ ์ด์
๋ฐ ๊ธฐ๋ณธ์ ์ผ๋ก emotion
์ฌ์ฉ์ ๋ํด ๊ฑฑ์ ํ๊ณ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ก ์ธํด ๋จธํฐ๋ฆฌ์ผ UI ๋ฐ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ดํธ ์ ๋ ๋๋ง ์ฑ๋ฅ ์ด 3-5 ๋ฐฐ (์ด๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ๊ตฌ์ฑ ์์์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ๋ณต์กํ ์๋ก ์ฐจ์ด๊ฐ ์ ์ต๋๋ค.)
๋ช ๊ฐ์ง ์ง๋ฌธ๊ณผ ์๊ฐํ ์์ :
makeStyles
์ ํธํ๊ธฐ ๋๋ฌธ์ DX์กฐ์ฐจ๋ ๋
ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค.makeStyles
์ ๋ฌธ์ ๋ ๊ฒฐ์ ์ ์บ์ ID๋ฅผ ๊ตฌํํ์ฌ ์์ ํ ์์๋ ๋์ ์คํ์ผ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ํ์ฌ ๋ชจ๋ ๊ตฌ์ฑ ์์ ์ธ์คํด์ค๋ ์ํ๊ณผ ์ถ๋ ฅ ์คํ์ผ์ด ๋์ผํ๋๋ผ๋ ๋์ ์ํ์ ๋ํ ๊ณ ์ ID๋ฅผ ๊ฐ์ ธ ์ค๋ฏ๋ก ๋ฐํ์ ์ค๋ฒ ํค๋๊ฐ ๋ฐ์ํ๊ณ ํค๋์ ๋ง์ ์คํ์ผ ํ๊ทธ๊ฐ ๋ฐ์ํ๋ฉฐ SSR ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ง์ CSS๊ฐ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋์ ์คํ์ผ์ ๋ํ ํด์ฑ ์ ๋ต์ ์ฌ์ฉํ์ฌ ์์ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ด๋ จ : https://github.com/mui-org/material-ui/pull/16858emotion
๋ฐ styled-components
์์ ๋ ๊ฐ๊น์ ์ง๊ฑฐ๋ makeStyles
๋ณด๋ค ๋์์ง ์ฌ์ง๊ฐ ์์ต๋๊น?๋๋ ์ฝ๊ฐ์ ์ฑ๋ฅ ์์ค๋ก ์ด ์ ์์ต๋๋ค.
์ด๋ ํ ๋น์ฉ๋ ๋ฐ์ํ์ง ์๊ณ 300 %์ ์ฑ๋ฅ ์์ค์ด ์์ต๋๋ค. ๐
@satazor ๋ฅผ ํ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ์์ ์ ์์ํ๊ธฐ ์ ์ ๊ฐ๋ ฅํ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์ํํ์ต๋๋ค. ์์ธํ ๋ด์ฉ์ PR https://github.com/mui-org/material-ui/pull/22173 ์ ์ฐธ์กฐํ์ญ์์ค (ListItem ๊ตฌ์ฑ ์์์์ ์ํ). ์ฑ๋ฅ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํ๋ก๋์ ๋ชจ๋์์ x1000 ์ธ์คํด์ค๋ฅผ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ ๋๋ถ๋ถ
https://deploy-preview-22173--material-ui.netlify.app/performance/list-raw/
https://deploy-preview-22173--material-ui.netlify.app/performance/list-mui/
https://deploy-preview-22173--material-ui.netlify.app/performance/list-styled/
https://deploy-preview-22173--material-ui.netlify.app/performance/list-styled-wrapper/
์ด๋ฅผ ๋ฐํ์ผ๋ก ์ฐ๋ฆฌ๋ ์ป์ ์์๋ ์ด์ (์ฆ์ ์ฌ์ฉํ ์์๋ ๋์ ์ํ, ์ด๋ฏธ ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ์คํ์ผ์ด ์ง์ ๋ API ๋ฑ) ๋๋ฌธ์์ด ์ฐจ์ด๋ฅผ ๋ฌด์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ ์ฒด ์์ฝ์ ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค. ํ๋ณด ์ค๋ช :))
๋ฒค์น ๋งํฌ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ํ์คํ์ง ์์ง๋ง 3-5x๊ฐ ๋๋ฌด ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ด๋ฐ ๊ฒฝ์ฐ์ emotion
/ styled-compoenents
ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์๋ํด ๋ณผ ์ ์์ต๋๋ค. ๋๋ฝ ๋ ํญ๋ชฉ์ด์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๋ ๋ฒค์น ๋งํฌ์ ์ฐจ์ด์ ์ ํ์ธํฉ๋๋ค. ๋ํ ์ค์ MUI ๊ตฌ์ฑ ์์์ ๋ํ ๋ฒค์น ๋งํฌ๋ฅผ ์ํํ๋ ๊ฒ์ด ์ ์๊ฐ์ ํจ์ฌ ๋ ์ข์ ๊ฒ์ด๋ฏ๋ก ๋ ํ์ค์ ์ธ ์์น๋ฅผ ์ป์ ์ ์์ผ๋ฏ๋ก์ด ์ธก๋ฉด์ ๋ํด ๋ ์์ธํ ์์๋ณด๊ณ ์ถ๋ค๋ฉด ์๋ ค์ฃผ์ญ์์ค. ๋ด๊ฐ ์ฐ๊ฒฐ ํ PR์ ์ข์ ์ถ๋ฐ์ ์
๋๋ค.
@mnajdova ๋ต์ฅ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. Mui ๊ตฌ์ฑ ์์์ ๋ํ ํ ์คํธ๊ฐ ๋ ํ์ค์ ์ด๋ผ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ์๋ง๋ ๋ฐ์ํ ์์๋ ๊ฒ์ List ๊ตฌ์ฑ ์์์ Mui ์ฝ๋๊ฐ ์ฃผ๋ ๋๋ฆฐ ์์ธ์ด๊ณ ์ด๋ค ๊ฐ์ ์ฐจ์ด (~ 30ms)๋ ์คํ์ผ๊ณผ ๊ด๋ จ๋ ์ค์ ๋ ๋๋ง ์๊ฐ ์ฐจ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๊ทธ PR์ ์ฝ๋๋ฅผ ๊ฐ์ ธ ์์ ๋ฒค์น ๋งํฌ์ ์ถ๊ฐํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.
์ด๊ฒ์ด ๊ฒฐ๊ตญ ๋ฌธ์ ๊ฐ ๋ ๊น์? ์๋ง ์๋ ์๋ ์์ง๋ง ์ฑ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ํ์ฌ Mui ๊ตฌ์ฑ ์์์ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ฑ๋ฅ ์ฐจ์ด๋ ๋ ๋๋ง ์ฝ๋ ์์ฒด๊ฐ ๋ ๊ฐ๋จ ํด์ง์ ๋ฐ๋ผ ์ฆ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ด์ฝ ๋๋ ํ์ดํฌ๊ทธ๋ํผ ๊ตฌ์ฑ ์์์ ์ฐจ์ด๋ ์ฆ๊ฐํ์ง๋ง ์นด๋์ ์ฐจ์ด๋ ์ค์ด๋ค ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก๋ ์ฑ๊ณผ ์ฑ์ด ์ฌ์ฉํ๋ ๊ฐ ์ ํ์ ๊ตฌ์ฑ ์์ ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๋จธํฐ๋ฆฌ์ผ UI ๋ฐ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ดํธ์ ๋ ๋๋ง ์ฑ๋ฅ์ด 3-5 ๋ฐฐ ๊ฐ์ํฉ๋๋ค.
์ด ์์๊ฐ์๋ ๋ฒค์น ๋งํฌ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ชจ๋ ๋จ์ผ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ฌํ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ์๋๋๋ค. ์ด ์คํด์ ์์ง๊ฐ์๋ ์ ๋ณด๋ ๋์ ๋๋ ๋ฌธ์ ์์ ๋งค์ฐ ์ฝ๊ฒ ํผ์ง๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํ๊ฒ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ์๋๋กํ์ญ์์ค.
devtools ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ ์ด์๋ ๋ง์ดํธ์ ๊ฒฝ์ฐ 140ms, makeStyles๋ก ๋ง์ดํธํ๋ ๊ฒฝ์ฐ 120ms๋ฅผ ๋ณด์์ต๋๋ค.
์ด ์์๊ฐ์๋ ๋ฒค์น ๋งํฌ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ชจ๋ ๋จ์ผ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ฌํ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ์๋๋๋ค. ์ด ์คํด์ ์์ง๊ฐ์๋ ์ ๋ณด๋ ๋์ ๋๋ ๋ฌธ์ ์์ ๋งค์ฐ ์ฝ๊ฒ ํผ์ง๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํ๊ฒ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ์๋๋กํ์ญ์์ค.
๋น์ ๋ง์ด ๋ง์์, ๋ด ์ด์ ๋๊ธ์๋ณด์ธ์.
์ด ์์๊ฐ์๋ ๋ฒค์น ๋งํฌ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ชจ๋ ๋จ์ผ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ฌํ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ์๋๋๋ค. ์ด ์คํด์ ์์ง๊ฐ์๋ ์ ๋ณด๋ ๋์ ๋๋ ๋ฌธ์ ์์ ๋งค์ฐ ์ฝ๊ฒ ํผ์ง๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํ๊ฒ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ์๋๋กํ์ญ์์ค.
devtools ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ ์ด์๋ ๋ง์ดํธ์ ๊ฒฝ์ฐ 140ms, makeStyles๋ก ๋ง์ดํธํ๋ ๊ฒฝ์ฐ 120ms๋ฅผ ๋ณด์์ต๋๋ค.
๋ด๊ฐ ์ฌ์ฉํ๋ ๋ฒค์น ๋งํฌ๋ฅผ ์
๋ฐ์ดํธ ํ actualDuration
๋์ baseDuration
์ฐ๋ฆฌ๊ฐ ์ง๊ธ DevTools๋ก ํ๋กํ์ผ์ ํ์๋๋ ๋ด์ฉ๊ณผ ๋ ๋ง์ ์ธ๋ผ์ธ ๊ฐ์ ๋ณผ ์ ์๋๋ก. baseDuration
๋ ๋ฉ๋ชจ์์ด ์๊ฐ์ ์ธก์ ํ๋ ๋ฐ๋ฉด actualDuration
๋ ๊ทธ ๋ฐ๋์
๋๋ค. ์ด ๋ณ๊ฒฝ ์ฌํญ์ rerender ์ฑ๋ฅ์๋ง ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด์ rerender์ ๊ฒฝ์ฐ makeStyles
6-8 ๋ฐฐ ๋ ๋น ๋ฅด๊ฒ ํ์๋ฉ๋๋ค. ์ฆ, ๋ ๋์ ์บ์ฑ / ๋ฉ๋ชจ๋ฆฌ ํ๋ฅผ ์ ๊ณตํฉ๋๊น? ๊ทธ๋ฌ๋ ๋๋ ๋น์ ์ด๋ณด๊ณ ์๋ ๊ฐ์น๋ฅผ ์ป์ง ๋ชปํ๊ณ ์์ต๋๋ค. ์
๋ฐ์ดํธ ๋ ๋งํฌ๋ฅผ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๊น?
@satazor ๋๋ ๋น์ ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋๋ฑํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ํด์ผํฉ๋๋ค.
๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ ์ดํดํ๋ ค๊ณ ์๋ํ๋ฉด ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
<MenuItem>
์ด <li>
๋ณด๋ค ๊ฑฐ์ x10 ๋๋ฆฐ ์ด์ ).์ค์ ๋ก @oliviertassinari. ๊ฐ์ / ์คํ์ผ ๊ตฌ์ฑ ์์๋ก ์งํ๋๋ ์ฑ๋ฅ์ ์ฌ๊ธฐ์์ ๊ตฌํ ํ Typography
์ ๊ฐ์ ๋จ์ํ ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ์๋ ์ต๋ 1.5x-2x ์์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค : https://codesandbox.io/ s / css-in-js-comparison-forked-lr3sr? file = / src / components / EmotionTypography.js.
ํ๋ก๋์ ๋น๋ ๋ฐ ๋ฒค์น ๋งํฌ๋ https://csb-lr3sr-7lp24bj5l.vercel.app/ ์์ ํ์ธํ์ญ์์ค.
makeStyles
๋ ๋ง์ดํธ์ 1.5 ~ 2 ๋ฐฐ, ๋ฆฌ ๋ ๋์ 3 ~ 4 ๋ฐฐ ๋ ๋น ๋ฆ
๋๋ค. ์ด๊ฒ์ ์ ์ฌ์ ์ผ๋ก ์ฃผ์ํด์ผ ํ ์ฌํญ์ด์ง๋ง ๋ ๋ณต์กํ ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ ํธ์ฐจ๊ฐ ํจ์ฌ ์ ์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ ๋ ๋ ์ด์ ์ฑ๋ฅ์ ๋ํด
@mnajdova ๋ค์์ ๋ชฉ๋ก ํ ์คํธ๋ฅผ์ํ ํ๋ก๋์ ๋น๋์ ๋๋ค. https://csb-lr3sr-3zi42510w.vercel.app/?components=1000 , ์ธ๊ธ ํ PR์ ๋ณต์ฌ๋ณธ ์ ๋๋ค. Codesandbox ๋งํฌ : https://codesandbox.io/s/css-in-js-comparison-forked-6s4nl
makeStyles
๋ ๋ง์ดํธ์ 1.7 ๋ฐฐ, ๋ฆฌ ๋ ๋์ 2.2 ๋ฐฐ ๋ ๋น ๋ฅด๊ฒ ๋ณด์
๋๋ค. ๋๋ ๋น์ ์ด๋ณด๊ณ ์๋ 10 % ์ฐจ์ด๋ฅผ ์ป์ง ๋ชปํ๊ณ ์์ต๋๋ค. ๋ด๊ฐ ๋ญ ์๋ชปํ๊ณ ์๋?
@satazor ํฅ๋ฏธ
import Slider from '@material-ui/core/Slider';
๋ (๊ฐ์ ).
import SliderStyled from '@material-ui/lab/SliderStyled';
vs (์คํ์ผ ๊ตฌ์ฑ ์์).
import SliderStyled from '@material-ui/lab/SliderStyled';
์ด ์์ ์์ ์ ๋๋ฆฐ ์ง ์๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋ณ๋ชฉ ํ์์ ์คํ์ผ์ ์์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์ ๋ชจ๋์์ ์คํํ์ต๋๋ค โ ๏ธ!
Slider์ WIP ๊ฐ์ ๋ฒ์ ์ ์ฑ๋ฅ์๋ณด๊ธฐ ์ํด ๋ ๊ฐ์ ์ ํ์ด์ง๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
ํ๋ก๋์ ์ฉ์ผ๋ก ๋น๋๋๋ฉด ํต๊ณ๋ https://github.com/mui-org/material-ui/issues/22342#issuecomment -697540546๊ณผ ๋น์ทํด ๋ณด์ด์ง๋ง ์ฝ x1.6 ๋๋ฆฝ๋๋ค (ํ์ง๋ง CSS๋ ์์ ํ ๋์ ์). WIP ๊ฐ์ ๋ฒ์ ์ผ๋ก ํ๋ ์ด ํ ์ ์์ต๋๋ค.
๋ํ withStyles : # 15023 ๋์ makeStyles๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ JSS ๋ฒ์ x1.1์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์์ ์๊ณ ์์ต๋๋ค.
prod ๋ชจ๋์ @oliviertassinari ๋ ์กฐ๊ธ ๋ ๋นจ๋ผ์ง์ง๋ง ์ฐจ์ด์ ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ๋ฐฐํฌ> ์ฝ๋ ์๋ ๋ฐ์ค์ vercel์ ํด๋ฆญํ์ฌ ํ๋ก๋์ ๋น๋ ํ๋๊ทธ๋ก ๋น ๋ฅด๊ฒ ๋ฐฐํฌ ํ ์ ์์ต๋๋ค.
makeStyles
๊ตฌํ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๋ฉด ์ ์ ์คํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ๋น ๋ฅธ์ง ์ ์ ์์ต๋๋ค.
attach
๊ฐ ํธ์ถ๋ฉ๋๋ค.stylesCreator.create
๊ฐ ํธ์ถ๋๊ณ makeStyles(fn)
์ง์ ๋ fn
ํธ์ถ๋ฉ๋๋ค.stylesCreator.create
๋ฅผ ๊ฑด๋ ๋๋๋ค.๋ค์ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ :
attach
๊ฐ ํธ์ถ๋ฉ๋๋ค.stylesCreator.create
๋ฅผ ๊ฑด๋ ๋ฐ๋ฏ๋ก ์์
์ด ์ ํ ์ํ๋์ง ์์ต๋๋ค.๋์ ์คํ์ผ์ด ์ ์ฉ๋๋ ๊ฒฝ์ฐ ์ํธ๋ ๋ชจ๋ ๋ง์ดํธ ๋ฐ ๋ค์ ๋ ๋๋ง์์ ์ฌ๊ธฐ ์์ ์ ๋ฐ์ดํธ๋์์ ๊ฒ์ ๋๋ค.
๋ฐ๋๋ก styled-components
๋ฐ emotion
๋ ๋ชจ๋ ๊ตฌ์ฑ ์์ ์ธ์คํด์ค์์ ์คํ์ผ๋ง ํจ์๋ฅผ ์คํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๋ ๋ง์ CPU์ฃผ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์ญ์์ด ๋ฐ์ํฉ๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ด๋ป๊ฒ ๋ ์ํ ์กฐํฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ค ๋ฉ๋ชจ ์บ์๋ฅผ ํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ด๊ฒ์ ์คํ์ผ๋ง ๊ธฐ๋ฅ์ด ์์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค.
const someContext = useContext(FooContext);
return <div css={ { paddingTop: someContext.padding(1) } }>;
๋ด ๊ฐ์ ์ด ์ณ๋ค๋ฉด, ์๋ ๋ฐฉ์๊ณผ API ์ค๊ณ ๋ฐฉ์์ด styled
๋๋ makeStyles
์ ์ฑ๋ฅ ์์ค์ ๋๋ฌํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ธ ๊ฒ์
๋๋ค. css
API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ์ ํ ์์๋ ๋ช ๊ฐ์ง ๊ฐ๋ฅํ ๋ฐฉํฅ์ ๋ด ๋๋ค.
์ด๋ป๊ฒ ๋ emotion
๊ฐ https://github.com/emotion-js/emotion/issues/1321 ๋ฐ https://github.com/emotion- ์์ ์์ฒญ ๋ ๊ฒ์ฒ๋ผ useCss
ํํฌ๋ฅผ ๋
ธ์ถ ํ ๊ฒฝ์ฐ js / emotion / issues / 1853 , makeStyles
API๋ฅผ ์ ์งํ ์ ์์ผ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก "์ ์ CSS"์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ๋ชจ๋ ๊ณณ์์ ์ ์ CSS๋ฅผ ๊ณ์ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ์ด๋ ๊ทธ๋ ๊ฒ "๊นจ๋ํ"๊ฒ์ ์๋์ง๋ง v4์์ ์ด๋ฏธ ์ํํ๊ณ ์๋ ์์
์
๋๋ค.
์ค์ ๋ก ClassNames
API๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ CSS ์ฑ๋ฅ์ ์ด์ ๊ณผ ๊ฐ์ ์ด ๊ฐ๋ ๋์ CSS์ ์ข์ ์ฑ๋ฅ์ ์ ์งํ๋ withStyles
ํฌํธ๋ฅผ ์ง๊ธ ์ํ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. const css = useCss()
์ด์๋ ๊ฒฝ์ฐ useStyles
API ํฌํธ๋ฅผ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋จํฉ๋๋ค.
๊ฐ์ ์ ์ฌ์ฉํ๋ withStyles
+ makeStyles
API๋ฅผ ์ ์งํ๋ ์ฃผ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
withStyles
๋ฐ makeStyles
๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ ๋ง์ด๊ทธ๋ ์ด์
ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ค์ ๋ฌด๋ฃ๋ก ๋์ CSS์ ๋ํ ํฅ์๋ ์ฑ๋ฅ์ ์ด์ ์ ์ป์ ๊ฒ์
๋๋ค.classes
+ CSS API๋ฅผ ์ ์งํ๋ ๋ฐ ์ถ๊ฐ ๋ก์ง์ด ํ์ํ์ง ์์ต๋๋ค. styled
๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ญ className
๋ฅผ ์๋์ผ๋ก ๋๋ util๋ก ๋ง๋ค์ด์ผํฉ๋๋ค.useCss
๋ styled
๋์ JS ์๋ฃจ์
์ CSS ์ฉ ์ด๋ํฐ ํจ์์
๋๋ค.styled
์ฒ๋ผ webpack / babel ์จ๋ฆฌ์ด์ฑ์ ์ํํ์ฌ ์ ํ ํ ์ ์์ต๋๋ค.์ฑ๋ฅ ๋ฌธ์ ๋ https://twitter.com/olivtassinari/status/1309247827839680512 ์์ ์์ธํ ์ดํด ๋ณด์์ต๋๋ค
https://codesandbox.io/s/slider-comparison-forked-jziv6?file=/src/App.jsโฆ
ํ ๋ก ๋ฆ๊ฒ ์ฌ๊ธฐ์์ ๊ท์ฐฎ๊ฒํด์ ๋ฏธ์ํ์ง๋ง styled-jsx๋ฅผ ์์ธํ ์ดํด ๋ณด์ง ์์์ ์กฐ๊ธ ๋๋์ต๋๋ค.
๊ทธ๋ค์ ๋ชฉ๋ก์ ๊ทํ์ ์๊ตฌ ์ฌํญ์ ์ ํํ ์ถฉ์กฑํ์ต๋๋ค.
๊ฑฐ์ ๊ทธ๋ฆผ์ CSS ํ์ค API ๋ผ๋ ์ฌ์ค์ ์ฃผ๋ชฉํ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ jsx
์์ฑ์ ์ ๊ฑฐํ๋ฉด ํฅํ ์ผ๋ฐ ๋ธ๋ผ์ฐ์ BTW์์ ์ด๋ฏธ ์๋ํ๋ ์น ๊ตฌ์ฑ ์์๋ก ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์, ๊ฐ์ฅ ์ธ๊ธฐ์๋ ๊ฒ์ด ์๋ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ๋ช ๋
์ ์๋ Flash๊ฐ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ์น ํ์ค์ ์ค์ํ์ง ์๊ณ ๋ง๋ผ์ ์ด์ SVG๊ฐ ์์ต๋๋ค.
๊ธฐ๋ก์ ์ํด SVG ํ์ค์ Flash๊ฐ ์
๊ณ๋ฅผ ์ง๋ฐฐ ํ ๋ ์ค๋ซ๋์ ์กด์ฌํ์ต๋๋ค.
๋๋ ๋จ์ง ์ญ์ฌ์ ์ฌ๊ฑด์ ์ข์ ๊ตํ์ผ๋ก๋ณด๊ณ ์ธ๊ธฐ๊ฐ ๋ฐฉํ ์ ์ง ๋ฐ ๋ฏธ๋ ์ฆ๊ฑฐ์ ๋ง์ง๋ง ์งํ๋ผ๋ ํจํด์ ๋ฐ๊ฒฌํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค.
@mifrej ๊ฐ์ธ์ ์ผ๋ก https://github.com/vercel/styled-jsx/issues/142 ์์ ๋์ ๊ฒฝํ์ํ์ต๋๋ค
์ฑ๋ฅ ๋ฌธ์ ๋ https://twitter.com/olivtassinari/status/1309247827839680512 ์์ ์์ธํ ์ดํด ๋ณด์์ต๋๋ค
- ๊ธฐ๋ณธ : 7.71ms
- v5 ์คํ์ผ ์์ : 20.89ms
- v4 : 29.93ms
- v5 : 37.37ms
- antd : 53.48ms
- ์ฐจํฌ๋ผ : 64.67ms
https://codesandbox.io/s/slider-comparison-forked-jziv6?file=/src/App.jsโฆ
๊ฐ์ / ์คํ์ผ ๊ตฌ์ฑ ์์์ ๋ํ babel ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น? ํ์ด๋ฐ์ ์ฐจ์ด๊ฐ ์์๋์?
๊ธฐ์กด MUI ๊ตฌ์ฑ ์์์์ ์ฌ์ฉํ ์์๋ classes
prop์ ๋ํ JSS์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฌด์์ ์๋ฏธํฉ๋๊น? v5 ๋ง์ด๊ทธ๋ ์ด์
์์ด ์ํ์ ๊ด๋ฒ์ํ๊ฒ ํ์ฉํ๋ ๊ธฐ์กด ์ฌ์ฉ์๋ฅผ ์ด๋ป๊ฒ ์ฐพ์ต๋๊น?
์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๋์ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ํฉ๋๋ค : https://next.material-ui.com/components/slider-styled/#unstyled -slider ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ์ ๊ฐ ์ฌ๋กฏ์ ์ฌ์ฉํ ์์๋ ํด๋์ค ์ ํ๊ธฐ๋ก ๋์ฒด๋ฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์์ ๋ ์ดํด๋ณผ ์ ์์ต๋๋ค : https://next.material-ui.com/components/slider-styled/#customized -sliders
์ฅ์ ์ผ๋ก ์ํ์ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์คํ์ผ์ ์ ์ฉ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๋์ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ํฉ๋๋ค : https://next.material-ui.com/components/slider-styled/#unstyled -slider ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ์ ๊ฐ ์ฌ๋กฏ์ ์ฌ์ฉํ ์์๋ ํด๋์ค ์ ํ๊ธฐ๋ก ๋์ฒด๋ฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์์ ๋ ์ดํด๋ณผ ์ ์์ต๋๋ค : https://next.material-ui.com/components/slider-styled/#customized -sliders
์ฅ์ ์ผ๋ก ์ํ์ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์คํ์ผ์ ์ ์ฉ ํ ์ ์์ต๋๋ค.
์ด API๊ฐ ๋ง์์ ๋ญ๋๋ค! ๋งค์ฐ ํ์๋ฐ๋ ๋ณํ์ด๋ฉฐ ์คํ์ผ ์์ง๊ณผ ์ ๋ง ์ ์ด์ธ๋ฆฌ๋ ๊ฒ ๊ฐ์ต๋๋ค.
v5
์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ฉด JSS ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ํด๋์ค ์ด๋ฆ์ ์๋ง์ผ๋ก ๋ง๋ค๊ณ ์์ ์ ์ผ๋ก ๋์์ ์ง์ ํ ์ ์์ต๋๊น? ํ์ง๋ง ์ด์ ๋ ํ๊ฒํ
๋ชฉ์ ์ผ๋ก ๋
ธ์ถ ๋ ๊ฒ ๊ฐ๋์? ๐ ๋ํ CSS ์ฐ์ ์์ ๋ฌธ์ ๊ฐ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ฌธ์ ๋์ด ์๋ก์ด ์ ๊ทผ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ๋ฉ๋๊น? ์ด ๋ฆฌํฉํฐ๋ง ์์
์ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
@ConAntonakos ์ ํํ ์ด๋ฌํ ํด๋์ค๋ ์คํ์ผ์ด ์ง์ ๋์ง ์์ ๋ฒ์ ๊ณผ ์คํ์ผ์ด ์ง์ ๋ ์ปดํฌ๋ํธ ๋ฒ์ ๋ชจ๋๋ฅผ ๋์์ผ๋ก ํ ์ ์์ต๋๋ค. ์คํ์ผ์ด ํธ์ถ๋๋ ์์๋ ํน์ ์ฑ์ด ๋์ผํ ๊ฒฝ์ฐ ์ ์คํ์ผ์ด ์ด๊ธธ ๊ฒ์์ ๋ณด์ฅํฉ๋๋ค. :)
v5 ์ด์ ์๋ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ฉด JSS ์ปดํ์ผ๋ฌ๊ฐ ํด๋น ํด๋์ค ์ด๋ฆ์ ์๋ง์ผ๋ก ๋ง๋ค๊ณ ์์ ์ ์ผ๋ก ๋์์ ์ง์ ํ ์ ์์ต๋๊น?
์ด๋ฏธ v4์์ ํ๊ฒํ ํ ์ ์์ต๋๋ค.
ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ์ ๊ฐ ์ฌ๋กฏ์ ์ฌ์ฉํ ์์๋ ํด๋์ค ์ ํ๊ธฐ๋ก ๋์ฒด๋ฉ๋๋ค.
"๊ธฐ๋ณธ์ ์ผ๋ก"๋์ฒด๋ฉ๋๊น, ์๋๋ฉด ์ค์ ๋ก ๋์ฒด๋ฉ๋๊น? ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์ด์ API ์ค ์ผ๋ถ๋ฅผ ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์ด์ API ์ค ์ผ๋ถ๋ฅผ ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
theme.components.overrides
๋ํด ๋์ผํ API๋ฅผ ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ํ
๋ง์ ์ ์ ๋ ์ฌ์ ์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
์ธ์คํด์ค ์ฌ์ ์์ ๊ฒฝ์ฐ ์ด์ ํด๋์ค ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ styled
์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก classes
prop์ด ๋ ์ด์ ์ง์๋์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ด์ ๋ ์ ์ฐํ๊ฒ ๋์ผํ ์์
์ ์ํ ํ ์ ์์ต๋๋ค.
๊ฐ๋ฐ์๋ ์ด์ ๋ ์ ์ฐํ๊ฒ ๋์ผํ ์์ ์ ์ํ ํ ์ ์์ต๋๋ค.
๋์์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ํ ๋ฌธ์ ์ธ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ๋ง์ด๊ทธ๋ ์ด์ ๋น์ฉ์ ์์ฒญ๋ฉ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ๊ณํ์ ์ด๋ป๊ฒ ์๊ฒผ์ต๋๊น?
๊ฐ๋ฐ์๋ ์ฌ์ ํ ํ
๋ง ์ฌ์ ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธ์คํด์ค ์ฌ์ ์๋ฅผ ์ค์ฒฉ ๋ ThemeProvider
๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ ๋ ์ฌ์ด์ ๊ตฌ์กฐ๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ ์ ๋ ์คํ์ผ์ ์ ํ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค (์๋ฒฝํ์ง ์์ต๋๋ค). ,ํ์ง๋ง ์ฆ๋ถ ์
๊ทธ๋ ์ด๋๋ฅผ ์ํ ๊ฒฝ์ฐ ๊ฐ ๊ธธ)
๋ค๋ฅธ ํํธ์ผ๋ก, ์ฐ๋ฆฌ๋ ์ฌ์ ํ classes prop์ ์ฝ๊ฒ ์ง์ํ ์ ์์ง๋ง,์ด ๊ฒฝ์ฐ class + styled์ ์กฐํฉ์ด ์ฐ์นํด์ผ ํ ๋์ผํ ๊ตฌ์ฑ ์์์ ์ฌ์ฉ๋๋์ง ๋ณด์ฅ ํ ์ ์์ต๋๋ค. ์ต์ํ ์คํ์ผ์ด ์ ์ฉ๋ ์ปดํฌ๋ํธ ๋ฒ์ ์์ ํด๋์ค ์ง์์ ๋ฐฑ ํฌํธํด์ผํฉ๋๊น?
์ด ์ค๋ ๋๋ฅผ ํตํด ์ด๊ฒ์ ๋์ณค์ ์ ์์ต๋๋ค- classes
์ง๋ฌธ์ ๋ํ ๋ ๋ค๋ฅธ ๊ด๋ จ ์ง๋ฌธ. ์ด๋ค ์ข
๋ฅ์ "์ ํ์ฑ"๋ณด์ฅ์ด์์ ์ ์์ต๋๊น?
์๋ฅผ ๋ค์ด ์ฌ๋ผ์ด๋ ์์ ๋ฅผ ํธ์งํ์ต๋๋ค.
const StyledSlider = styled(SliderUnstyled)`
& .MuiSlider-raill {
display: block;
position: absolute;
width: 100%;
height: 2px;
border-radius: 1px;
background-color: currentColor;
opacity: 0.38;
}
)
๋ด๊ฐ ์ค์๋ก MuiSlider-rail
์ฒ ์๋ฅผ ์๋ชป ์
๋ ฅํ์์ ์ ์ ์์ต๋๋ค. ์ด์ ์๋ classes
ํ๋ฉด classes.rail
์ ๊ฐ์ ๋ด์ฉ์ด ํ์๋๋ฉฐ ์์ฑ ์ฒ ์๋ฅผ ์๋ชป ์
๋ ฅํ๋ฉด classes.raill
๊ฐ ์คํ์ผ ์ํธ์ ์กด์ฌํ์ง ์๋๋ค๋ ๋ฐํ์ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค. ํ
๋ง๊ฐ ๊ฐ์ ํ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๊น?
classes
API์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
.css-e7ylz8 .MuiTreeItem-group
. ๊ตฌ์ฑ ์์๊ฐ ์์ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ ์ ์ฉํ์ง ์๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค (์์ํ๋ ํจ๊ณผ๊ฐ ์๋๋๋ค. ๋๋์ต๋๋ค!). ์ฐ๋ฆฌ๊ฐ ์กฐ์ฌํ ๊ฒ์ด๋ฏ๋ก ์๋ง๋ ์ฐ๋ฆฌ ๊ตฌ์ฑ ์์์ ๋ํด ๊ด์ฐฎ์ต๋๋ค.$styleRule
๊ตฌ๋ฌธ์ ์คํ์ผ ๊ท์น์ด ์ ์๋์ง ์์ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ํฉ๋๋ค.componentsProps
prop์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ํด๋์ค ์ด๋ฆ์ ๋ณํฉํฉ๋๋ค.์ฐ๋ฆฌ๊ฐ ํ ์์๋ ๋์ ์ธ๊ณ๊ฐ ์์ต๋๋ค.
ใ
. ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์ ์ ํ๊ธฐ๋ก 1. ๋ฐ 3.์ ํ ์ ์์ต๋๋ค.
๋น. ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด classes
API๋ฅผ ๋
ธ์ถํฉ๋๋ค.
์จ. ์ป๊ธฐ ์ํด. ๊ทธ๋ฆฌ๊ณ b. ์๋ํ๋ ค๋ฉด ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ๋ด๋ถ์ ์ผ๋ก ์์ฑ๋๋ ๋ฐฉ์์ ํํํ๊ฒํด์ผํฉ๋๋ค. x ์คํ์ผ ๊ตฌ์ฑ ์์ 1 ๊ฐ ์คํ์ผ ๋ฃจํธ ๋์ . ๊ทธ๋ฌ๋ โ ๏ธ ์ฑ๋ฅ์ ์๋ฏธํฉ๋๋ค.
์ ๋ง ๊ทธ๋ ๊ฒํด์ผํฉ๋๊น?
jQuery UI์ classes
prop์ ์ญ์ฌ๋ฅผ ์ดํด ๋ณด์์ต๋๋ค. ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค : https://bugs.jqueryui.com/ticket/7053 , https://bugs.jqueryui.com/ticket/8928 ๋ฐ ์ด๊ธฐ ์ปค๋ฐ : https://github.com/jquery/jquery- ui / commit / c192d4086d9bbaf09d5f870857af30c60a427e22.
์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๋์ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ํฉ๋๋ค : https://next.material-ui.com/components/slider-styled/#unstyled -slider ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ์ ๊ฐ ์ฌ๋กฏ์ ์ฌ์ฉํ ์์๋ ํด๋์ค ์ ํ๊ธฐ๋ก ๋์ฒด๋ฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์์ ๋ ์ดํด๋ณผ ์ ์์ต๋๋ค : https://next.material-ui.com/components/slider-styled/#customized -sliders
์ฅ์ ์ผ๋ก ์ํ์ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์คํ์ผ์ ์ ์ฉ ํ ์ ์์ต๋๋ค.
์์ฐ,์ด๊ฒ ์ต๊ณ ์ผ.
์คํ์ผ์ด ์ง์ ๋์ง ์์ ๋๋ ํค๋๋ฆฌ์ค ๊ตฌ์ฑ ์์๋ ์ฌ์ฉ์ ์ง์ ์ ๊ฐ์ฅ ์ ํฉ ํ ๊ฒ์
๋๋ค (๋ฌด์ด์ ๋ํ ๋นํ๊ฐ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค).
์ด๊ฒ์ imo๋ฅผ ๊ณ ์น๋ ์์ ๊ฒ์ด ์๋๋ผ MUI์ Hude Plus์
๋๋ค.
์ถ์ : ๊ณผ๊ฑฐ์ ์ผ๋ถ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค.
PS2 : https://github.com/modulz/stitches๋ฅผ ๋ณด์
จ์ต๋๊น?
์ค์๋ก MuiSlider-rail์ ์ฒ ์๊ฐ ํ ๋ ธ์์ ์ ์ ์์ต๋๋ค. ์ด์ ์๋ classes.rail๊ณผ ๊ฐ์ ๊ฒ์ด ์์๊ณ ์์ฑ์ ์ฒ ์๋ฅผ ์๋ชป ์ ๋ ฅํ๋ฉด classes.raill์ด ์คํ์ผ ์ํธ์ ์กด์ฌํ์ง ์๋๋ค๋ ๋ฐํ์ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค. ํ ๋ง๊ฐ ๊ฐ์ ํ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๊น?
@ianschmitz ์คํ์ผ ๊ตฌ์ฑ ์์ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ํ @oliviertassinari ์ต์ ์ธ์๋ ๋ ธ์ถํ๋ ํด๋์ค์ ๋ํ ์์๋ฅผ ๋ ธ์ถํ๋ ๋ ๋ค๋ฅธ ์ต์ ์ด ์์ต๋๋ค. ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import { sliderClasses } from '@material-ui/core/Slider';
const StyledSlider = styled(SliderUnstyled)`
& .${sliderClasses.rail} {
display: block;
position: absolute;
width: 100%;
height: 2px;
border-radius: 1px;
background-color: currentColor;
opacity: 0.38;
}
)
classes.rail
๋ฐํ์ ๊ฒฝ๊ณ ์ ๋์ผํ์ง๋ ์์ง๋ง ํด๋์ค ๋ง์ถค๋ฒ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
@mnajdova eslint ํ๋ฌ๊ทธ์ธ๋ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
classes
prop์ ๋ํ ์ง์๊ณผ ๊ด๋ จํ์ฌ-์ด ์์
์ ์์ ์ ์ผ๋ก ์ํํ๋ ค๋ฉด ํต์ฌ ๊ตฌ์ฑ ์์์ ๊ฐ ๋ถ๋ถ (์ฌ๋กฏ)์ ๋ํ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค์ด์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Slider
๊ฒฝ์ฐ ๋ ์ผ, ํธ๋, ๋งํฌ, ๋งํฌ ๋ ์ด๋ธ, ์์ง ๋ฐ ๊ฐ ๋ ์ด๋ธ์ ๋ํ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค์ด์ผํฉ๋๋ค. ์ด๋ฅผ ํตํด ํน์ด์ฑ์ ๋์ด๊ธฐ ์ํด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ ํด๋น ๊ตฌ์ฑ ์์์ ์ง์ ์คํ์ผ์ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์์ด PR- https: //github.com/mui-org/material-ui/pull/22893์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ณ๊ฒฝ์ ํตํด ์ฐ๋ฆฌ๋ ์๋ก์ด ์ ๋ฐ์ดํธ ๋ Slider ๊ตฌ์ฑ ์์์ ์ฑ๋ฅ์ v4, ๊ธฐ๋ณธ ์คํ์ผ, ์คํ์ผ ์์ ๋ฐ ๋ค๋ฅธ ๋ ๊ฐ์ ๊ฒฝ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ( https://codesandbox.io/s/) ์ ๋น๊ตํ ์์๋ ์ฝ๋ ์๋ ๋ฐ์ค๋ฅผ ๋ง๋ค์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ๋์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง ๊ทธ๊ฒ์ ๋ถ๋ถ์ ํด๋์ค ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐํ ํ ์ด๋ฌํ ๋ฐํ ํ์ ๋น๊ตํ๋ฉด - https://codesandbox.io/s/slider-comparison-forked-jziv6?file=/src/App.js ์ฌ๋กฏ ๋น ๊ตฌ์ฑ ์์๋ฅผ ์ถ๊ฐํ๋ฉด ์ฑ๋ฅ์ด 20 % ์ ํ๋ฉ๋๋ค .๐ข
์์ฐ ๋ฒ์ :
์์งํ ๋งํด์ ์ง๊ธ์์ด ํ์ ํธํ์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ๋์์ง ์ฌ๋ถ๋ฅผ ์ ์ ์์ต๋๋ค.
classes
์ง์์์ํ ์ค์ ์ฌ์ฉ ์ฌ๋ก์
๋๊น, ์๋๋ฉด ์
๊ทธ๋ ์ด๋๋ฅผ ์ฉ์ดํ๊ฒํ๊ธฐ์ํ ๊ฒ์
๋๊น?
๋ง์ด๊ทธ๋ ์ด์
๊ฒฝ๋ก๋ฅผ ์ํํ๊ธฐ ์ํด์๋ง ์ฑ๋ฅ์ด 20 % ์ ํ ๋์ด๋ ๊ด์ฐฎ์ต๋๊น?
์ฑ๋ฅ ๋น์ฉ์ ์ง๋ถํ์ง ์๊ณ ์ด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ํ ํ ์ ์๋๋ก ์ฐ๋ฆฌ๊ฐ ๋ณผ ์์๋ ๋์์ด ์์ต๋๊น?
@ianschmitz @ eps1lon @oliviertassinari ๋ฐ ๊ธฐํ :) ์ด๊ฒ์ ๋ํ ์๊ฐ์ด ์์ต๋๊น?
TypeScript๋ก ํ ๋ง์ ์คํ์ผ์ ์ ์ํ๊ณ ์ฌ์ฉํ ์์๋ ํ, 20 % ์ฑ๋ฅ์ ์๋ ๊ฒ์ ๋นํด ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ์๊ฐ์ ์๋นํด๋ ๊ด์ฐฎ์ต๋๋ค.
๋๋ ์ผ๋ฐ์ ์ผ๋ก ํธ๊ธฐ์ฌ์ด ๋ง์ผ๋ฉฐ ๊ธฐ๋ณธ ๋์์ธ์ ์ดํดํ์ง ๋ชปํ์ง๋ง classes
๊ฐ JSS ์ฉ API์์ต๋๊น? API ๋์์ธ์ด JSS์์ ์คํ์ผ์ด ์ง์ ๋ ๊ตฌ์ฑ ์์๋ก ์ ํํ๋ ๊ฒฝ์ฐ classes
๋ฅผ ๊ณ์ ์ง์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๊น?
classes
์ง์์์ํ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋๊น, ์๋๋ฉด ์ ๊ทธ๋ ์ด๋๋ฅผ ์ฉ์ดํ๊ฒํ๊ธฐ์ํ ๊ฒ์ ๋๊น?
๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก๋ฅผ ์ํํ๊ธฐ ์ํด์๋ง ์ฑ๋ฅ์ด 20 % ์ ํ ๋์ด๋ ๊ด์ฐฎ์ต๋๊น?
์ฑ๋ฅ ๋น์ฉ์ ์ง๋ถํ์ง ์๊ณ ์ด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ํ ํ ์ ์๋๋ก ์ฐ๋ฆฌ๊ฐ ๋ณผ ์์๋ ๋์์ด ์์ต๋๊น?
์ ์ ๋ API์ ๋ํด ๋์น ๊ฒ์ด ์๋ค๋ฉด ์ฌ๊ณผํ์ง๋ง, IMO๋ ์ฐ๋ฆฌ ์กฐ์ง ๋ด์์ ๊ฐ์ฅ ์์ฃผ ๋ณด๋ ์ฌ์ฉ ์ฌ๋ก๋ MUI์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์คํ์ผ๋ง ์์คํ
์ ์ถ์ํ์
๋๋ค. ์, @ConAntonakos๊ฐ ์ธ๊ธํ๋ฏ์ด classes
๋ ์ผ์ข
์ "API for JSS"๋ผ๊ณ ์๊ฐ ํ์ง๋ง ์๋น์์๊ฒ๋ ์ค์ํ์ง ์์์ต๋๋ค. ์๋น์๋ก์ ์ ํธํ๋ CSS ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค (์ค๋๋ classes
์์ต๋๊น?). ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ ํ์ ์ฌ์ฉํฉ๋๋ค.
ํด๋น ํ์ ํ์์ ์ ํธ๋์ ๋ฐ๋ผ
CSS-in-JS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋์ค ์ด๋ฆ์ ๋ด๋ณด๋ด๋ ๊ฒ์ด ๋์์ด๋์ง๋ง ๊ทธ๋ ์ง ์์ ์ฌ๋๋ค์ ๋ํ ์๊ฐ์ ์ด๋ป์ต๋๊น?
๋ . 20 % perf, ๋๋ ์์ฉ ํ ์์๋ ์ ์ถฉ์์ด ์๋ ์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ํ๋ฃจ๊ฐ ๋๋๋ฉด ๋๋ถ๋ถ์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ํด ์ต์ ์ ๋คํด์ผํฉ๋๋ค. ๋ด ์๊ฐ์ ์ ๊ณตํ๋ ๊ฒ๋ฟ์ ๋๋ค ๐
๋ด๊ฐ ๊ฒฐ์ฝ ์ป์ง ๋ชปํ ํ ๊ฐ์ง ์์์ material-ui๊ฐ ๋ฐ์ ๋ค์ดํฐ๋ธ์ ํธํ๋๋ค๋ ๊ฒ์ ๋๋ค. ์์ฆ ๋ง์ ํ๋ก์ ํธ๊ฐ ํฌ๋ก์ค ํ๋ซํผ์ด๋ฉฐ ํตํฉ ์คํ์ผ๋ง ์๋ฃจ์ ์ ์ฌ์ฉํ๋ฉด ํฌ๋ก์ค ํ๋ซํผ ๊ตฌ์ฑ ์์์ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์น ์ธก์์๋ material-ui๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์ดํฐ๋ธ ์ธก์์๋ react-native-paper๋ฅผ ์ฌ์ฉํ๊ณ material-ui API๋ก ํ์คํํ์ต๋๋ค. ์ด ์๋ก์ด ์คํ์ผ๋ง ์๋ฃจ์ ์ด react-native์์ (์ผ๋ถ / ์ ์ฒด) Material UI ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ์ดํดํ๊ณ ์ถ์ต๋๋ค. ๊ตฌ์ฑ ์์์ ๋ชจ๋ ์ฐฝ ์ฐธ์กฐ๋ ๋ถ๋ช ํ ์ฐจ๋จ๊ธฐ์ด์ง๋ง ์คํ์ผ ์์ฒด๋ ๋ค์ดํฐ๋ธ๋ ์ง์ํ์ง ์์ต๋๊น?
@mschipperheyn react-native๋ ์ง๊ธ๊น์ง ๋ชฉํ๊ฐ ์์ต๋๋ค. ์ฌ์ฉ ์ ์ฌ๋ ฅ์ + 5 % (1 ๊ฐ์ ์ฑ์ฅ)์ + 50 % ๋ ๋ง์ ๋ ธ๋ ฅ (์ถ์ธก)์ ๋๋ค. ์์ต ํ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ ๋ฐฉํฅ์ด์๋ ๊ธฐํ ๋น์ฉ์ ์ ๋ง ๋์ต๋๋ค (Ionic์ ๋ชจ๋ธ ์ธ๋ถ). ๋ํ flutter๋ ๋ค์ดํฐ๋ธ ํ๊ฒ์ ๋ฐ์ํ๋ ๋ง์ ์ฒญ์ค์ ์ฌ๋ก ์ก์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ v5๊ฐ ์ํ ๋ฆด๋ฆฌ์ค์ด๋ฏ๋ก์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ํนํ ์คํ์ผ๋ง ์๋ฃจ์ ์ ์ฌ์ ํ โโJSS ๊ธฐ๋ฐ์ ๋๊น? ์ฐ๋ฆฌ๋ JSS์ ๊ด๋ จ๋ ์๋นํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ณด์์ผ๋ฏ๋ก ์๋ก์ด ์๋ฃจ์ ์ ๊ฐ์ ํ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
@zzzev ์ด๊ฒ์ ๊ทธ ์์ฒด๋ก ๋ฌธ์ ๊ฐ ์๋๋๋ค. RFC (Request for Comments) ์ค๋ ๋์ ๋๋ค.
๋๋ ๋น์ ์ด ๋งํ๋ ์ค์ง์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ์ JSS์์ ์ด๋ป๊ฒ ๊ทธ๊ฒ์ ํฅ์์ํฌ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋ด๊ฐ ๋ณด๋ ๋ฐฉ์์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ์๋ ๊ฒฝ์ฐ ์๋ง๋ ์คํ์ผ์ด ์๋๋ผ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฆ, ๋ ์ ์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์คํ์ผ์ ์์ฑํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ ์ด๋ ๋๋ JSS์์ Emotion (์ด ์ค๋ ๋์์ _ ๋๋ถ๋ถ ์ฑ๋ฅ ์ ํ๊ฐ์์ ๊ฐ๋ฅ์ฑ์ด ์์)์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ์ด๋ค ๊ฒ์ ๊ฐ์ ํ ์ ์๋์ง์ ๋ํด์๋ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ด ์ดํด๋ ๊ฐ์ ์ด ์ ์ ์ธ ์คํ์ผ ์ฑ๋ฅ์ ์ฝ๊ฐ์ ํ๊ฒฉ์์ฃผ๊ณ ํจ์ฌ ๋ ๋์ ๋์ ์คํ์ผ ์ฑ๋ฅ์ ์ ๋ฐํ๋ค๋ ๊ฒ์ ๋๋ค.ํ์ง๋ง ๊ทธ๊ฒ ์ณ์ง ์์ ์๋ ์์ต๋๋ค. ์ด ์ค๋ ๋์๋ ๋ง์ ๋ค๋ฅธ ์ซ์๊ฐ ์์ผ๋ฉฐ ํ๋์ ์ฑ๋ฅ ๊ทธ๋ฆผ์ผ๋ก ์กฐ์ ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค (๋ถ๋ช ํ ๊ฐ์ธ์ ์ํฉ์ ๋ฐ๋ผ ๋ง์ด ๋ฌ๋ผ์ง).
์คํ์ผ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ฑํด์ผํ๋ค๊ณ ํ ๋ ๋์ ์คํ์ผ์ ํผํ๋ค๋ ์๋ฏธ์ ๋๊น? ์๋๋ฉด ๊ณ ๋ คํด์ผ ํ ๋ค๋ฅธ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์์ต๋๊น?
@zzzev ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ์ ํํ๊ณ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ์ ํํ์ง ์์ต๋๋ค (์ง์๋์ง ์๋ ๋ถ๋ถ์์ ๋ฌดํํ ์ฑ๋ฅ ํฅ์์ผ๋ก ์ง์๋๋ ๊ฒ์ผ๋ก ๊ณ์ฐํ์ง ์๋ ํ).
๊ฐ์ ์ ์ ์ ์ ๋ํด ๋ค์ ๋๋ฆฐ ์ฑ๋ฅ์ ํฌ์ํ๋ฉด์ ๋์ ์คํ์ผ์ ์ง์ํฉ๋๋ค.
ํผ๋ ์ค๋ฝ์ต๋๋ค. ํ์ฌ / v4 makeStyles์ ๋์ ์คํ์ผ์ด ์์ต๋๊น? ์ : ์ด ํจํด
ํผ๋ ์ค๋ฝ์ต๋๋ค. ํ์ฌ / v4 makeStyles์ ๋์ ์คํ์ผ์ด ์์ต๋๊น? ์ : ์ด ํจํด
์๋ ค์ง ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ ํ์ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ATM
๋ ๊ทธ๋ฅ ์ปดํฌ๋ํธ ์คํ์ผ์ด ์ซ์ด
Node.js๋ ์ข์ง๋ง ๋๋ฒ๊น
, ์ฑ๋ฅ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ &:after
์ ๊ฐ์ ์ค์ฒฉ๊ณผ ๊ฐ์ ์ผ๋ถ ๋ฒ๊ทธ๋ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
react-native ๋ฐ react-native-web์ ๋ํ ๋ด ํจํค์ง ๋น๋์
๋๋ค.
https://www.npmjs.com/package/@material-native-ui/theme -provider
๋๋ ์ด๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ์ํ๋ค (๊ทธ๊ฒ์ RN๊ณผ RNW ์์ ์์ฌ์๋ค)
๊ทธ๋ ๋ค๋ฉด Material UI v5์ ํจ๊ป ์ฌ์ฉํ ๊ถ์ฅ ์คํ์ผ ์๋ฃจ์
์ ๋ํ ๊ฒฐ๋ก ์ด ์์ต๋๊น? ํ์ฌ @material-ui/styles
์ด ๊ตฌ์ถ๋์ด์๋ JSS์์ ๋ฒ์ด๋๋ ค๋ ์๋๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋๋ฉด @material-ui/styles
styled-components
๋์
๊ทธ๋ ๋ค๋ฉด Material UI v5์ ํจ๊ป ์ฌ์ฉํ ๊ถ์ฅ ์คํ์ผ ์๋ฃจ์ ์ ๋ํ ๊ฒฐ๋ก ์ด ์์ต๋๊น? @ material-ui / styles๊ฐ ํ์ฌ ๊ตฌ์ถ ๋ JSS์์ ๋ฒ์ด๋๋ ค๋ ์๋๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋๋ฉด @ material-ui / styles๊ฐ ๋ฆฌํฉํ ๋ง๋์ด ์คํ์ผ ๊ตฌ์ฑ ์์์ ๊ฐ์ ๋ค๋ฅธ ์คํ์ผ๋ง ์๋ฃจ์ ์ ๋์ ๋น๋ํ ๊น์?
@ matthewkwong2 ์ฐ๋ฆฌ๋ @material-ui/styles
ํจํค์ง๋ฅผ ์๋ก์ด ์คํ์ผ์ ์์ง์ ์ฑํํ์ง ์์ ๊ฒ์ด๋ฉฐ, jss๋ฅผ ๊ณ์ ์ง์ํ ๊ฒ์
๋๋ค. v5์์๋ ์ฝ๋๋ฒ ์ด์ค์ ๋๋จธ์ง ๋ถ๋ถ์ผ๋ก ๊ฒฉ๋ฆฌ๋๋ฉฐ ์๋ก์ด ์คํ์ผ๋ง ์์ง์ผ๋ก์ ์ ํ์ ๋๊ธฐ ์ํด v6์์ ์ ๊ฑฐ ํ ๊ณํ์
๋๋ค.
v5์ ๊ฒฝ์ฐ sx
prop ๋ฐ styled
์ ํธ๋ฆฌํฐ์ ๊ฐ์ ์คํ์ผ๋ง ์๋ฃจ์
์ ๋ํ ์๋ก์ด ๋นํธ ๊ดํ์ด์์ ๊ฒ์
๋๋ค.
๋ํ ํ ๋ง ์ฌ์ ์ ๋ฐ ๋ณํ์ v5์์ ๊ณ์ ์ง์๋ฉ๋๋ค.
v5์ ๊ฒฝ์ฐ sx prop ๋ฐ ์คํ์ผ ํ ๋ ์ ํธ๋ฆฌํฐ์ ๊ฐ์ ์คํ์ผ๋ง ์๋ฃจ์ ์ ๋ํ ์๋ก์ด ๋นํธ ๊ดํ์ด์์ ๊ฒ์ ๋๋ค.
๋ํ ํ ๋ง ์ฌ์ ์ ๋ฐ ๋ณํ์ v5์์ ๊ณ์ ์ง์๋ฉ๋๋ค.
๋ด๊ฐ ์ ๋๋ก ์ดํดํ๋ค๋ฉด, ๊ฐ๋ณ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ ์ํด, ๊ทธ๊ฒ์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅ sx
๋๋ styled
๋์ makeStyles
.
ํ์ง๋ง ํ
๋ง (์ : createMuiTheme
)๋ ์ด๋ป์ต๋๊น? ๊ทธ ๋ถ๋ถ๋ JSS๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ง๊ธ ํ
๋ง๋ฅผ ๋ง๋๋ ๋ฐ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ (์ : ๊ธ๋ก๋ฒ ์คํ์ผ์ ์ ์ํ๋ ์ฃผ์ ๋ชฉ์ )์ ๋ฌด์์
๋๊น?
์ฐ๋ฆฌ๋ ์ฌ์ ํ ํ ๋ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋์ผํ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๊ณ ์์ผ๋ฉฐ, ์ปดํฌ๋ํธ ์ค๋ฒ๋ผ์ด๋ ๋ฐ ๋ณํ ๊ฐ์ด ๊ฐ์ / ์คํ์ผ ์ปดํฌ๋ํธ ๊ตฌ๋ฌธ์ ๋ฐ๋ฅผ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค. ํ ๋ง ์์ฑ ๋ฐฉ๋ฒ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ผ๋ฉฐ API๋ ์ ํํ ๋์ผํ๋ฉฐ ๋์ผํ ํ ๋ง ์ปจํ ์คํธ๊ฐ ์ ์คํ์ผ ์์ง์๋ ์ฌ์ฌ์ฉ๋ฉ๋๋ค. @ matthewkwong2 ์ด ์๋ฏธ๊ฐ ์์ต๋๊น?
@mschipperheyn react-native๋ ์ง๊ธ๊น์ง ๋ชฉํ๊ฐ ์์ต๋๋ค. ์ฌ์ฉ ์ ์ฌ๋ ฅ์ + 5 % (1 ๊ฐ์ ์ฑ์ฅ)์ + 50 % ๋ ๋ง์ ๋ ธ๋ ฅ (์ถ์ธก)์ ๋๋ค. ๊ธฐํ ๋น์ฉ์ด ์ ๋ง ๋์ต๋๋ค. ๋ํ flutter๋ ๋ค์ดํฐ๋ธ ํ๊ฒ์ ๋ฐ์ํ๋ ๋ง์ ์ฒญ์ค์ ์ฌ๋ก ์ก์ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๋ฅผ ๋๋ฌด ํฐ ์ ์ ์ผ๋ก ๋ฐ์๋ค์ด๊ณ ์ถ์ง ์์ง๋ง ์ด๋ฌํ ๊ทผ๊ฑฐ ์ค ์ผ๋ถ๋ฅผ ๋ค๋ก ๋ฐ๊ณ ์ถ์ต๋๋ค.
๊ฐ์ ์ผ๋ก์ ์ ํ์ RN์์ MUI๋ฅผ ์๋์ํค๋ ์ด๋ ค์์ 2/3๋ฅผ ์ ๊ฑฐํ์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋น์ ์ POC๋ฅผ ๊ธฐ๋ํฉ๋๋ค ๐
์ฐ๋ฆฌ๋ ๋น์ ์ POC๋ฅผ ๊ธฐ๋ํฉ๋๋ค ๐
๊ธฐํ๊ฐ๋๋ค๋ฉด ๊ฐ์ง๊ณ ๋๊ณ ์ถ์ด์. ๊ทธ๋ฌ๋ ์ฌ๋๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๊ด๋ฆฌ์๊ฐ ๋ฌด๊ด์ฌํ ๊ฒ์ ๋ํด POC๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ท์ฐฎ๊ฒํ์ง ์์ต๋๋ค. ํ์ฌ ๋ถ์๊ธฐ๊ฐ ์๋ง๋ ๋ฒ๋ ค ์ง ๊ฒ์ด๋ผ๋ ์ ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ง๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ RN์ ๊ฐ์น ๋๋ RN์ ๊ฐ์น๋ฅผ ๋ฏธ๋์ ๋ํ ๊ฐ๋ฅ์ฑ์ผ๋ก ๋ฌด์ํ์ง ์์ผ๋ ค๋ ์ด์ ์ ๋๋ค.
๋ ๊ฐ์ง ์ง๋ฌธ :
classes
๋๋ถ๋ถ์ ๊ตฌ์ฑ ์์๊ฐ ์ฌ์ ํ ์ง์๋ฉ๋๊น (์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์์๋ ์คํ์ผ๋ง ์๋ฃจ์
์ ์์ ํ ์ ์ฐ์ฑ์ ์ ๊ณต ํ ๊ฒ์)?fast-refresh
๋ create-react-app v4 ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค. ๋น ๋ฅธ ์๋ก ๊ณ ์นจ ์ง์์ ์๋ก์ด ์๊ตฌ ์ฌํญ์ผ๋ก ์ถ๊ฐํด์ผํฉ๋๊น?
๊ฐ์ธ ๋น์ ํจ๊ป ์๋ํด๋ณด์ธ์. import { Link } from '@material-ui/core'
๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
Can't resolve '@emotion/core' in 'node_modules/@material-ui/styled-engine'
File: node_modules/@material-ui/styled-engine/index.js
Can't resolve '@emotion/styled' in '/node_modules/@material-ui/styled-engine'
File: node_modules/@material-ui/styled-engine/index.js
import Link from '@material-ui/core/Link'
๋ณ๊ฒฝํ๋ฉด ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ก์ต๋๋ค.
@emotion/styled @emotion/core
์ค์นํ๋ฉด ๋ค์์ ์ป์์ต๋๋ค.
'/ node_modules / @ emotion / styled / dist'์์ '@ emotion / react'๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ @emotion/react
ํฉ๋๋ค.
๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Error: The `@emotion/core` package has been renamed to `@emotion/react`. Please import it like this `import { jsx } from '@emotion/react'`.
./node_modules/@emotion/core/dist/emotion-core.cjs.dev.js
node_modules/@emotion/core/dist/emotion-core.cjs.dev.js:3
๊ด๋ จ ํจํค์ง ๋ฒ์ :
"@emotion/core": "^11.0.0",
"@emotion/react": "^11.0.0",
"@emotion/styled": "^11.0.0",
"@material-ui/core": "^5.0.0-alpha.15",
"@material-ui/lab": "^5.0.0-alpha.15",
v10 ๋ฒ์ ์ Emotion ํจํค์ง ์ค์น
Oh 11์ ์ด์ "์ต์ "๋ฒ์ ์ด๋ฏ๋ก mui๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ๋ฌธ์ํํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Oh 11์ ์ด์ "์ต์ "๋ฒ์ ์ด๋ฏ๋ก mui๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ๋ฌธ์ํํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
peerDependencies
๋ฒ์ ๋ฒ์๋ฅผ ํตํด ๋ฌธ์ํ๋์์ต๋๋ค. ๊ณง v11๋ก ์
๋ฐ์ดํธ ํ ๊ณํ์ด๋ฏ๋ก ์ค์น ์ง์นจ์์ ๋ช
์ ์ ์ผ๋ก ์ธ๊ธํ์ง ์์์ต๋๋ค.
์ด๊ฒ์ด ๋ถ๊ณผ ๋ฉฐ์น ์ ์ ์ํ์ ๊ฐ์ ์ด๋ผ๋ ๊ฒ์ ์๋ ค์ฃผ์ญ์์ค. ์ผ๋ฆฌ ์ด๋ตํฐ๋ก์ ๋น์ ์ ๊ฑฐ์น ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๊ธฐ๋ํด์ผํฉ๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ ๋ ์ฌ๊ธฐ ์๋ก ์๊ณ material-ui css ์๋ฃจ์
์ ์ฐพ๊ณ ์์๊ณ ์ด ๋ฌธ์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ํด 2 ์ผํธ๋ฅผ ์ฃผ๋ฉด Linaria https://github.com/callstack/linaria ๋ฅผ ์ ์ํ๊ณ ์ถ์ต๋๋ค
CSS ์ถ์ถ ๋ฐ CSS ๋ณ์๋ฅผ React ์ํ์ผ๋ก ์ฌ์ฉํ๋ ์ ๋ก ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
์ด๊ฒ์ด์ด RFC ๐์ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Emotion์ ๋ฉ์ธํ ์ด๋๋ก ๋งํ๊ธฐ-์ด๊ฒ์ ํ๋ฅญํ๊ฒ ๋ค๋ฆฝ๋๋ค ๐
์ฐ๋ฆฌ๋ ๋ํ ์ด๋ค ํ๋ช ๋ ์์ ์๋ก์ด ๋ฉ์ด์ ๋ฅผ ๊ณง ์ถ์ ํ ์ ์์ด์ผํฉ๋๋ค. ์ผ๋ถ ์ ๋ฆฌ, ์ ๋ฐ์ ์ธ ๊ฐ์ , ๋ด๋ถ ํํฌ ๋ฐ TS ์ ํ ๊ฐ์ (๋ ๋์ ์ถ๋ก ๋ฐ ์ฑ๋ฅ) ๋ง ์์ต๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ์ฌ ์์ฑ๋ ํ์! Emotion ๋ฐ Styled-Components์ ์ผ๋ถ ๊ฐ์ฅ์๋ฆฌ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค (ํ์ฌ ๋ ๋ค ๋์ผํ ํ์๋ฅผ ์ฌ์ฉํ๊ณ ์์). ๋ ์๊ณ ๋น ๋ฆ ๋๋ค.