Material-ui: [RFC] v5 ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜ ๐Ÿ’…

์— ๋งŒ๋“  2020๋…„ 08์›” 24์ผ  ยท  105์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mui-org/material-ui

์ด RFC๋Š” v5์—์„œ Material-UI์˜ ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์„ ๋ณ€๊ฒฝํ•˜๊ธฐ์œ„ํ•œ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

TL : DR;

๋ญ๊ฐ€ ๋ฌธ์ œ ์•ผ?

  • ํ›Œ๋ฅญํ•œ ์Šคํƒ€์ผ๋ง ์—”์ง„์„ ์œ ์ง€ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ๋Š” ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ง์ ‘ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ 12 ๊ฐœ์›” ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ์Šคํƒ€์ผ ์—”์ง„์„ ๊ฐœ์„ ํ•˜๊ธฐ๋ณด๋‹ค ํ•ต์‹ฌ ๊ฐ€์น˜ ์ œ์•ˆ ์ธ UI ๊ตฌ์„ฑ ์š”์†Œ์— ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์—๋Š” ๊ธฐํšŒ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋™์  ์Šคํƒ€์ผ์„ ์ง€์›ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ๋™์  ์Šคํƒ€์ผ ๊ตฌํ˜„ (props ๊ธฐ๋ฐ˜)์˜ ์„ฑ๋Šฅ ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์•„๋ž˜ ์„ฑ๋Šฅ ๋ฒค์น˜ ๋งˆํฌ ์ฐธ์กฐ). ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์˜ ํ’ˆ์งˆ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ œํ•œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅ์„ฑ ๋˜๋Š” ์“ฐ๊ธฐ ์Šคํƒ€์ผ์˜ ์šฉ์ด์„ฑ์— ๋Œ€ํ•œ API๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ์œ„ํ•œ ์ฐจ๋‹จ๊ธฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด style utils props , color variant ๋ฐ custom variant์˜ ์ž ๊ธˆ์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
  • React ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ JSS๋ฅผ ๋Œ€๊ทœ๋ชจ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํˆฌํ‘œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค (JSS๋Š” ํ›Œ๋ฅญํ•˜๊ณ  ์—ฌ์ „ํžˆ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค). 3 ๋…„ ์ „ ์šฐ๋ฆฌ๋Š” ๊ฐ€๋Šฅํ•œ ์ตœ์„ ์˜ ์„ ํƒ์— ๊ฑธ์—ˆ์Šต๋‹ˆ๋‹ค . ์ด์ œ ๋” ๋‚˜์€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์ธ์‹ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์กด ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•ํ•˜์—ฌ ๋” ๋น ๋ฅด๊ฒŒ ์ด๋™ํ•˜๊ณ  ๋” ๋‚˜์€ DX / UX๋ฅผ ์ž ๊ธˆ ํ•ด์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Material-UI์˜ ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ๋ฒˆ๋“ค์— ๋‘ ๊ฐœ์˜ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์ง€ ์•Š์Œ. CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ž ์žฌ์  ์ธ ๋ฌธ์ œ : ์‚ฌ์šฉ ๋œ ์—”์ง„์˜ ๊ตฌ๋ฌธ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•ต์‹ฌ ์Šคํƒ€์ผ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿคทโ€โ™€๏ธ)

์š”๊ตฌ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ด๋–ค ์Šคํƒ€์ผ๋ง ์—”์ง„์„ ์„ ํƒํ•˜๋“  ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ์„ฑ๋Šฅ : ๋น ๋ฅผ์ˆ˜๋ก ์ข‹์ง€๋งŒ DX๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์„ฑ๋Šฅ์„ ๊ตํ™˜ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒˆ๋“ค ํฌ๊ธฐ : ํ˜„์žฌ 14.3kB ์ดํ•˜์˜
  • ๋™์‹œ ๋ชจ๋“œ ์ง€์› : @material-ui/styles ์€ ์ œ๊ฐ€ ๊ธ€์„ ์“ฐ๋Š” ๋™์•ˆ ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • SSR ์ง€์›
  • ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ์ •์˜
  • ๋™์  ์Šคํƒ€์ผ๋ง ํ—ˆ์šฉ
  • ์ข‹์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ทœ๋ชจ
  • ํ…Œ๋งˆ
  • ํŽธํ‰ํ•œ ํŠน์ด์„ฑ
  • RTL
  • TypeScript

๋‹ค์Œ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ
  • ๊ฐ์ •
  • JSS (ํ˜„์žฌ material-ui๋กœ ๋ž˜ํ•‘ ๋จ)
  • ์Šคํƒ€์ผ ํŠธ๋ก 
  • ์•„ํ”„๋กœ๋””ํ…Œ
  • Fela
  • ๊ทธ๋ฐ–์—?

๋น„๊ต

๊ณต์—ฐ

๋‹ค์Œ์€ ์—ฌ๋Ÿฌ ์ธ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋™์  ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•œ ๋ฒค์น˜ ๋งˆํฌ์ž…๋‹ˆ๋‹ค (Material-UI v4๋Š” ์„ฑ๋Šฅ ์ด

์ฐธ๊ณ  ์šฉ PR : https://github.com/mnajdova/react-native-web/pull/1

์„ฑ๋Šฅ์— ๋”ฐ๋ผ JSS (ํ˜„์žฌ @ material-ui / styles๋กœ ๋ž˜ํ•‘ ๋จ), styletron ๋ฐ fela๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚จ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ
  • ๊ฐ์ •
  • ์•„ํ”„๋กœ๋””ํ…Œ
  • JSS
  • ๋ฐ˜์‘ ์Šคํƒ€์ผ ํŠธ๋ก 
  • Fela

๋‹ค์ด๋‚˜๋ฏน ์†Œํ’ˆ

๊ณต๊ฐœ ๋œ ๋ฌธ์ œ์— ๋”ฐ๋ฅด๋ฉด Aphrodite๋Š” ๋™์  ์†Œํ’ˆ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค : https://github.com/Khan/aphrodite/issues/141
์ œ ์ƒ๊ฐ์—๋Š” ์šฐ๋ฆฌ์˜ ์˜ต์…˜์—์„œ ๊ทธ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ
  • ๊ฐ์ •
  • ์•„ํ”„๋กœ๋””ํ…Œ
  • ๋ฐ˜์‘ ์Šคํƒ€์ผ ํŠธ๋ก 

npm

styled-components ์™€ emotion ๋Š” ๋‘˜ ๋‹ค ๊ฝค ์ธ๊ธฐ๊ฐ€ ์žˆ์ง€๋งŒ, ๊ทธ ๋‹น์‹œ์—๋Š” react-styletron ๋‚˜ ๊ธ€์ด ์ฃผ๋‹น ์•ฝ 12500 ํšŒ ๋‹ค์šด๋กœ๋“œ๋กœ ํ›จ์”ฌ ๋’ค์ณ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š” ์ด์œ , ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ๊ฐ€๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๋‹ค์‹œ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์Šคํƒ€์ผ ์—”์ง„์„ ์•ฑ์— ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค).

๋‹ค์Œ์€ ์ž‘์„ฑ ๋‹น์‹œ ์ฃผ๊ฐ„ ๋‹ค์šด๋กœ๋“œ ์ˆ˜์— ๋”ฐ๋ผ ์ •๋ ฌ ๋œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.



๋™ํ™”์ฑ…์€ ๊ฐ์ •์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ
  • ๊ฐ์ •
  • ๋ฐ˜์‘ ์Šคํƒ€์ผ ํŠธ๋ก 

๋™์‹œ ๋ชจ๋“œ ์ง€์›

  • ๊ฐ์ • : ์˜ˆ . v10๋ถ€ํ„ฐ๋Š” ๋ฐœํ‘œ ๊ฒŒ์‹œ๋ฌผ ์— ๋”ฐ๋ผ ์—„๊ฒฉ ๋ชจ๋“œ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ : ๋ถ€๋ถ„ . Strict ๋ชจ๋“œ์˜ ์ „์—ญ ์Šคํƒ€์ผ์—๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋ฒ„๊ทธ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

SSR

๋ณ„

  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ : 30.6k
  • ๊ฐ์ • : 11.4k
  • JSS : 5.9k

๋ฌธ์„œ์— ๋Œ€ํ•œ Trafic

SimilarWeb ์˜ˆ์ƒ ์„ธ์…˜ / ์›” :

  • sass-lang.com : ~ 476K / ์›” (๋น„๊ต ์šฉ)
  • styled-components.com : ~ 239K / ์›”
  • emotion.sh : ~ 59K / ์›”
  • cssinjs.org : <30k / ์›” (๋น„๊ต ์šฉ)

์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ

์„ค๋ฌธ ์กฐ์‚ฌ์— ๋”ฐ๋ฅด๋ฉด 53.8 %๊ฐ€ Material-UI ์Šคํƒ€์ผ (JSS)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Material-UI์˜ ์—”์ง„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 20.4 %๊ฐ€ ์ด๋ฏธ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ๋งŽ์€ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์„ค๋ฌธ ์กฐ์‚ฌ์— ๋”ฐ๋ฅด๋ฉด ํ˜„์žฌ ๊ฐœ๋ฐœ์ž์˜ ์•ฝ 1.9 %๊ฐ€ ๊ฐ์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ˆ˜์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์šฐ๋ฆฌ๋Š” ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ์ง€์›

  • ๊ฐ์ • : ์ตœ์‹  ์ƒ๋ก ๋ธŒ๋ผ์šฐ์ € + IE11
  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ : v5์— ๋Œ€ํ•ด ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด์ „ ๋ฒ„์ „์€ ๋‹ค์Œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฒˆ๋“ค ํฌ๊ธฐ

  • ๊ฐ์ • : 11.2kB
  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ : 12.5kB

์ตœ์„ ์˜ ์„ ํƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ธฐ๋ณธ ์—”์ง„

์—ฌ๋Ÿฌ ์—”์ง„์„ ์ง€์›ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ์—๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜๋ฅผ ์˜นํ˜ธํ•˜๊ณ  ํ•˜๋‚˜๋ฅผ ๋ฐ๋ชจ์— ๋ฌธ์„œํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ

์žฅ์  :

  • ๊ฐ€์žฅ ํฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์žˆ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
  • v5๋ถ€ํ„ฐ ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹จ์  :

  • ์ด๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ์Šคํƒ€์ผ์ด styled API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šคํƒ€์ผ์„ ๋‹ค์‹œ ์ง€์ •ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ๋ž˜ํผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ–๊ฒŒ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์™„์ „ํ•œ ๋™์‹œ ์ง€์›์ด ๋ถ€์กฑํ•˜์—ฌ ๊ธธ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ •

์žฅ์  :

  • ์ƒ๋Œ€์ ์œผ๋กœ ํฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ข‹์€ ์„ฑ๋Šฅ.
  • ๋™์‹œ ๋ชจ๋“œ + SSR์€ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CSS prop์€ ์žฌ์ •์˜์— ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์†Œ์Šค ๋งต ์ง€์›.
  • ์กฐ๊ธˆ ๋” ์ž‘์Šต๋‹ˆ๋‹ค.

๋‹จ์  :

์—ฌ๋Ÿฌ ์ง€์›

์‚ฌ๋‚ด ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์—ฌ๋Ÿฌ CSS-in-JS ์†”๋ฃจ์…˜์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์€ ์Šคํƒ€์ผ๊ฐ„์— ๊ตฌ๋ฌธ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ์ค‘๋ณต ์ž‘์—…์ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ / ๊ฐ์ •์— ๋น„ํ•ด ์ตœ์†Œํ•œ jss). ์–ด๋–ค ์†”๋ฃจ์…˜์„ ์„ ํƒํ•˜๋“  ํ…Œ๋งˆ ๊ฐœ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋œ ๊ด€์—ฌ ๋œ ์ง€์›์€ styled ์—์„œ ๋น„๋กฏ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์›นํŒฉ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค-(์ด๊ฒƒ์€ ๊ณ ๋ คํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค).

์ถ”๊ฐ€ ๋Œ“๊ธ€

์‚ฌ์šฉ์ž ์ง€์ • ์Šคํƒ€์ผ์„ ๋Œ€์ƒ์œผ๋กœ ํ•  ์ˆ˜์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฐ์ •์  ํด๋ž˜์Šค ์ด๋ฆ„

ํด๋ž˜์Šค์˜ ๋ชจ์–‘๊ณผ ๊ฐœ๋ฐœ์ž๊ฐ€์ด๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋น„๊ตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Slider ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒ์„ฑ ๋œ DOM์˜ ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ ํด๋ž˜์Šค๋Š” ๋งค์šฐ ์ž˜ ์„ค๋ช…ํ•˜๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ๊ฐ์ •, ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ผ๋ถ€ ํ•ด์‹œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœํ•˜๋Š” ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์†Œํ’ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ์ •์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ํด๋ž˜์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ MuiSlider-root & MuiSlider-colorPrimary ์™€ ๊ฐ™์ด ์ด์ „์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํด๋ž˜์Šค๋ฅผ ๊ณ„์† ๊ฐ–๊ฒŒ๋˜๋ฉฐ, ์œ ์ผํ•œ ์ฐจ์ด์ ์€์ด ํด๋ž˜์Šค๊ฐ€ ์ด์ œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์„ ํƒ๊ธฐ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ›„ํฌ์ฒ˜๋Ÿผ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค -useSliderClasses

๊ฒฐ๋ก 

์–ด๋–ค ์†”๋ฃจ์…˜์„ ์„ ํƒํ•˜๋“  ๋‘˜ ์ค‘ ๋‘ ๊ฐ€์ง€๊ฐ€ ์ง€์›ํ•˜๋Š” styled API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•ž์œผ๋กœ ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ preact ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ์›นํŒฉ ๋ณ„์นญ ์‚ฌ์šฉ).

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ์กฐ์‚ฌํ•œ ํ›„ ํ•ต์‹ฌ ํŒ€์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ์„ฑ์œผ๋กœ ๊ฐˆ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค . ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ :

์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ฐ์ • ์‚ฌ์ด์˜ ์ž‘์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ

์ด๋ฏธ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๊ฑฐ์˜ ๋…ธ๋ ฅ์—†์ด ๊ฐ์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ž˜ํผ ๊ตฌ์„ฑ ์š”์†Œ ์™ธ์— ์žฌ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ •์—์„œ cx + css๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ž˜ํผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์Šคํƒ€์ผ ์žฌ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ ๋ชจ๋“œ๋Š” ํ™•์‹คํžˆ ์ง€์›๋ฉ๋‹ˆ๋‹ค : +1 :

์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ์กฐ์‚ฌํ•ด ์ฃผ์‹  @ryancogswell ์—๊ฒŒ @emotion ์˜ ์ฝ”๋“œ์—์„œ ๋™์‹œ ๋ชจ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์šฐ๋ ค๋ฅผ์ฃผ๋Š” ์–ด๋–ค ๊ฒƒ๋„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์ •์˜ ๊ธ€๋กœ๋ฒŒ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ createGlobalStyle ๋„ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  (Strict / Concurrent ๋ชจ๋“œ์—์„œ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ) useEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ฆฌ ๊ธฐ๋Šฅ์—์„œ ์Šคํƒ€์ผ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. createGlobalStyle์€ ๋™์‹œ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์™„์ „ํ•œ ์žฌ ์ž‘์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์ด ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ์ค‘์— ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ง€๋‚œ ๋‹ฌ์— ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜์—ฌ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋”ฐ๋ผ์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ด์„ฑ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ?

Emotion์˜ ๋ฌธ์„œ๋Š” ์—ฌ๋Ÿฌ ํด๋ž˜์Šค ์ด๋ฆ„์˜ ์Šคํƒ€์ผ์„ ํ™œ์šฉํ•˜๋Š” ๋Œ€์‹  CSS๋ฅผ ๋‹จ์ผ ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. v5์—์„œ๋Š” ๊ธฐ์กด ์ „์—ญ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์Šคํƒ€์ผ์ด ์ฒจ๋ถ€๋˜์ง€ ์•Š์€ ์ฑ„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ตฌ์„ฑ์€ ์Šคํƒ€์ผ์„ ๋‹จ์ผ ํด๋ž˜์Šค๋กœ ์ž๋™ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์ด ๋‹จ์ผ ํด๋ž˜์Šค ์ด๋ฆ„ : +1 :์— ์˜ํ•ด ๊ตฌ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์–ด๋„ Material-UI์—์„œ ์ •์˜ํ•œ ์Šคํƒ€์ผ ๋‚ด๋ถ€์˜ ์ด๋Ÿฌํ•œ ์Šคํƒ€์ผ ์‹œํŠธ ์ˆœ์„œ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ „์—ญ ํด๋ž˜์Šค ์ด๋ฆ„ (๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉ์ž ์ง€์ •์„ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ƒ์„ ์ง€์ •) ํ•œ ๋‹ค์Œ ๋ชจ๋“  CSS ์†Œ์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ์š”์†Œ ๋‹น ํ•˜๋‚˜์˜ ์ƒ์„ฑ ๋œ (๊ฐ์ •์— ์˜ํ•ด) ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฐ์ •์— ์˜ํ•ด ํŠน์ด์„ฑ์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
๊ฐ์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ์ง€์…˜ (๋ Œ๋”๋ง ์‹œ๊ฐ„ ๋˜๋Š” ์ •์˜ ์‹œ๊ฐ„ ์ปดํฌ์ง€์…˜)์€ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹จ์ผ ํด๋ž˜์Šค๊ฐ€๋ฉ๋‹ˆ๋‹ค.
์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ Œ๋”๋ง ์‹œ๊ฐ„ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ •์˜ ์‹œ๊ฐ„ ๊ตฌ์„ฑ์€ ๋‹จ์ผ ํด๋ž˜์Šค๋กœ ๊ฒฐํ•ฉ ๋จ). ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋™์ผํ•œ ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด ๋™์ผํ•œ ์š”์†Œ์— ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ์ ์šฉ๋˜๊ณ  ํŠน์ • ์„ฑ์ด ๋‚ด๊ฐ€ ์˜๋„ ํ•œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์•ˆ


๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

discussion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Emotion์˜ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋กœ ๋งํ•˜๊ธฐ-์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค ๐Ÿš€

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์–ด๋–ค ํ˜๋ช…๋„ ์—†์„ ์ƒˆ๋กœ์šด ๋ฉ”์ด์ €๋ฅผ ๊ณง ์ถœ์‹œ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ •๋ฆฌ, ์ „๋ฐ˜์ ์ธ ๊ฐœ์„ , ๋‚ด๋ถ€ ํ›„ํฌ ๋ฐ TS ์œ ํ˜• ๊ฐœ์„  (๋” ๋‚˜์€ ์ถ”๋ก  ๋ฐ ์„ฑ๋Šฅ) ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„, ๊ทธ๋ฆฌ๊ณ  ์žฌ ์ž‘์„ฑ๋œ ํŒŒ์„œ! Emotion ๋ฐ Styled-Components์˜ ์ผ๋ถ€ ๊ฐ€์žฅ์ž๋ฆฌ ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค (ํ˜„์žฌ ๋‘˜ ๋‹ค ๋™์ผํ•œ ํŒŒ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ). ๋” ์ž‘๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋ชจ๋“  105 ๋Œ“๊ธ€

๋ช‡ ๊ฐ€์ง€ ์ˆ˜์ • ์‚ฌํ•ญ :

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 ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
image

์šฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌ ํ•œ ๋˜ ๋‹ค๋ฅธ ๋น„ ํšจ์œจ์„ฑ์€ StyledComponent ์œ„์—์„œ ์ƒˆ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํŒŒ์ƒ ๋  ๋•Œ ๊ธฐ๋ณธ StyledComponent ์—์„œ ๋ณต์‚ฌ ๋œ ๋ชจ๋“  css props๋กœ ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

const DerivedComponent = styled(StyledComponent)`
  font-family: monospace;
`

StyledComponent ์—์„œ ์ƒ์„ฑ ๋œ ์œ„์˜ CSS ํด๋ž˜์Šค์— font-family: monospace ๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ CSS ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ฆ‰, ์•„๋ž˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด StyledComponent ์—์„œ ๋ณต์‚ฌ ๋œ ๋ชจ๋“  props๊ฐ€์žˆ๋Š” CSS๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

image

์ด์ œ StyledComponent ๋ฐ DerivedComponent ์œ„์˜ StyledComponent ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด (์ฒ˜์Œ์—) css props๊ฐ€ ์ค‘๋ณต ๋œ ๋‘ ๊ฐœ์˜ css ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (font-family์—์„œ๋งŒ ๋‹ค๋ฆ„). ์•„๋ž˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด;

image

๋‹น์‹ ์ด ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ์„œ๋กœ ์ค‘๋ณต๋˜๋Š” 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 ์šฐ๋ฆฌ๊ฐ€ ๊ฐ์ •์— ๋Œ€ํ•ด ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฐ ์ด์œ ๋Š” ์‹ค์ œ๋กœ ๊ฒฐ๋ก ์˜ ๋„ค ๊ฐ€์ง€ ์š”์ ์ž…๋‹ˆ๋‹ค

  • ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ฐ์ • ์‚ฌ์ด์˜ ์ž‘์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ
    ์ด๋ฏธ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๊ฑฐ์˜ ๋…ธ๋ ฅ์—†์ด ๊ฐ์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ž˜ํผ ๊ตฌ์„ฑ ์š”์†Œ ์™ธ์— ์žฌ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ฐ์ •์—์„œ cx + css๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ž˜ํผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์Šคํƒ€์ผ ์žฌ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋™์‹œ ๋ชจ๋“œ๋Š” ํ™•์‹คํžˆ ์ง€์›๋ฉ๋‹ˆ๋‹ค ๐Ÿ‘
  • ํŠน์ด์„ฑ์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ๋ฒ•

์ฒซ ๋ฒˆ์งธ ์ ์„ ์—ผ๋‘์—๋‘๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฒˆ๋“ค์— ๋‘ ๊ฐœ์˜ css-in-js ์†”๋ฃจ์…˜์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ ๊ฐ์ •์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ์ด ๋งค์šฐ ์ ๊ณ  styled ์ด์™ธ์˜ ๋‹ค๋ฅธ API๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@ ko-toss์ด ๊ธ€์„ ์จ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ •์ด ๋ชจ๋“  ์Šคํƒ€์ผ๋กœ ํ•˜๋‚˜์˜ className์„ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์žฌ์ •์˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋” ๋‚˜์€ ์—”์ง„์ด๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ className์„ ์ƒ์„ฑ ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž‘์„ฑ๋œ ํด๋ž˜์Šค๊ฐ€ ์ด๊ธธ ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” ํ–ฅํ›„ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ชจ๋“  CSS ๊ทœ์น™์ด ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„์—์„œ ํ›จ์”ฌ ๋” ๋‚˜์€ ์›์ž CSS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์žฌ์ •์˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋ชจ๋“  ์Šคํƒ€์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ๊ตญ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์—, ์–ด๋–ค CSS-in-js ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋“  ์‚ฌ๋žŒ๋“ค์€ ๋ฌด์ž‘์œ„๋กœ ๋ฌดํ•œํ•œ ์Šคํƒ€์ผ ์กฐํ•ฉ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์—ฌ์ „ํžˆ ์†Œํ’ˆ ๊ฐ’์— ๋”ฐ๋ผ ๊ฝค ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ ์—ญ์‹œ ์šฐ๋ฆฌ๊ฐ€ ์—ผ๋‘์— ๋‘˜ ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค. ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

  • ๊ทธ๋ฐ–์—?

[stylex] ์•„์ด๋””์–ด ํ˜ธํ™˜์„ฑ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ ([style9] ๋“ฑ)

  • ๊ทธ๋ฐ–์—?

style9 ๋˜๋Š” stylex ์•„์ด๋””์–ด์™€ ํ˜ธํ™˜๋˜๋Š” ๊ธฐํƒ€ CSS ์—”์ง„

์ด๊ฒƒ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค, ํŠนํžˆ ์ดˆ๋ณด์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ๋นŒ๋“œ ์‹œ๊ฐ„ ์„ค์ •์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(์ด๊ฒƒ์€ ์˜คํžˆ๋ ค ์ฐธ๊ณ ๋กœ, ๊ฐ์ •์€ ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค)

https://github.com/cristianbote/goober (1kB, ๊ฐ์ •๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋‚˜์œ ์„ฑ๋Šฅ)

์•„์ง ๊ฒฝํ—˜์ด ์—†์ง€๋งŒ ์–ธ์  ๊ฐ€ ํ•ด๋ณด๊ณ  ์‹ถ์–ด์š”.
image
image

@cztomsik https://github.com/kuldeepkeshwar/filbert-js ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ JavaScript ๊ตฌ๋ฌธ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค (CSS ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด ๋งŒ ํ•ด๋‹น).

๋‹ค์Œ์€ ์ƒํ˜ธ ์ž‘์šฉ ์‹œ๊ฐ„์— Google Lighthouse๋กœ ์ˆ˜ํ–‰ ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

https://jantimon.github.io/css-framework-performance/

css-lighthouse-scores

์ฐธ๊ณ ๋กœ ๋ฐ”๋‹๋ผ API, css props API ๋ฐ ์Šคํƒ€์ผ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ v5, ๊ฐ์ • v10 ๋ฐ ๊ฐ์ • v11์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ† ๋ก ์— ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

https://github.com/simnalamburt/css-in-js-benchmark

์›์ž ์  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๋Š” ๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


์ œ๋กœ ๋Ÿฐํƒ€์ž„์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ์ œ๋กœ ๊ตฌ์„ฑ ์†”๋ฃจ์…˜์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋จธ๋ฆฌ์— ๋ชป์„ ๋ฐ•์€ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐ‘์ž๊ธฐ ๊ทธ ๊ฟˆ์„ ์ข‹์•„ ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์œ ํ† ํ”ผ์•„

ํƒ๊ตฌ ํ•  ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๊ณ  ์–ด์ฉŒ๋ฉด ํ˜‘๋ ฅํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์™€ ๊ฐœ๋… ์ค‘ ์ผ๋ถ€๋Š” ๋‚˜์—๊ฒŒ ์•ฝ๊ฐ„ ์ด์งˆ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์„ค๋ช… ํ•  ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ œ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

  • ์ •์  ๋ถ„์„-์ด๊ฒƒ์€ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ณ  X ๊ทœ์น™, ๊ทœ์น™ ๋˜๋Š” ์‚ฌ์–‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์–ป๊ณ  ์ตœ์ ํ™” ํ•  ์ˆ˜์žˆ๋Š” ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
  • ์ œ๋กœ ๊ตฌ์„ฑ-๊ฒŒ์œผ๋ฆ„์„ ์„ ํ˜ธํ•˜์—ฌ ๋” ๋งŽ์€ ์ž์œ ๋ฅผ ์šฐ์„ ์‹œํ•˜๋”๋ผ๋„ (x ๋ฒˆ ๋“ค๋Ÿฌ ์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜)
  • CSS-in-JSS์—์„œ ์ˆœ์ˆ˜ 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 ์žฅ :

์นด๋“œ 500 ์žฅ :

2500 ์žฅ์˜ ๊ฒฝ์šฐ :

์ „๋ฐ˜์ ์œผ๋กœ emotion ๋ฐ styled-components ์„ฑ๋Šฅ์€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ makeStyles ๋Š” ๋งˆ์šดํŠธ์‹œ ์ „์ฒด์ ์œผ๋กœ 2-4 ๋ฐฐ ๋” ๋น ๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด 6-8x ๋” ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์šฐ๋ฆฌ๊ฐ€ ํœด๋Œ€ํฐ๊ณผ ๊ฐ™์€ ์ €์ „๋ ฅ ์žฅ์น˜์—์„œ ๋ Œ๋”๋ง ํ•  ๋•Œ ๊ทธ ์ฐจ์ด๋Š” ์ถฉ๋ถ„ํžˆ ํฝ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์€ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ emotion ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ฑฑ์ • ํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋จธํ‹ฐ๋ฆฌ์–ผ UI ๋ฐ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์ดํŠธ ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ด 3-5 ๋ฐฐ (์ด๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ณต์žกํ• ์ˆ˜๋ก ์ฐจ์ด๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค.)

๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ๊ณผ ์ƒ๊ฐํ•  ์Œ์‹ :

  • DX๋Š” ์ •๋ง UX ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด makeStyles ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— DX์กฐ์ฐจ๋„ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • makeStyles ์˜ ๋ฌธ์ œ๋Š” ๊ฒฐ์ •์  ์บ์‹œ ID๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜์žˆ๋Š” ๋™์  ์Šคํƒ€์ผ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค๋Š” ์†Œํ’ˆ๊ณผ ์ถœ๋ ฅ ์Šคํƒ€์ผ์ด ๋™์ผํ•˜๋”๋ผ๋„ ๋™์  ์†Œํ’ˆ์— ๋Œ€ํ•œ ๊ณ ์œ  ID๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ํ—ค๋“œ์— ๋งŽ์€ ์Šคํƒ€์ผ ํƒœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ SSR ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋งŽ์€ CSS๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์  ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ํ•ด์‹ฑ ์ „๋žต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ : https://github.com/mui-org/material-ui/pull/16858
  • emotion ๋ฐ styled-components ์—์„œ ๋” ๊ฐ€๊นŒ์›Œ ์ง€๊ฑฐ๋‚˜ makeStyles ๋ณด๋‹ค ๋‚˜์•„์งˆ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋จธํ‹ฐ๋ฆฌ์–ผ UI๋Š” ๊ณต์‹ JSS ์—”์ง„ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ง€์›ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ๋งŽ์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์†์‹ค๋กœ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋– ํ•œ ๋น„์šฉ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  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 ๋ฐฐ ๋” ๋น ๋ฅด๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋” ๋‚˜์€ ์บ์‹ฑ / ๋ฉ”๋ชจ๋ฆฌ ํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹น์‹ ์ด๋ณด๊ณ ์žˆ๋Š” ๊ฐ€์น˜๋ฅผ ์–ป์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ๋œ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Screenshot 2020-09-22 092415
Screenshot 2020-09-22 092514

@satazor ๋‚˜๋Š” ๋‹น์‹ ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ๋™๋“ฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์žฅ์ฐฉํ•˜๋Š” ๋ฐ๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ํŠนํžˆ ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋ง ํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. makeStyles๋Š” div๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด ๊ฐ์ • / sc๋Š” ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๋ฒค์น˜ ๋งˆํฌ์—์„œ ๊ฐ ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ธฐ์ค€ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌ์„ฑ ์š”์†Œ์˜ 3 ๊ฐœ ์ˆ˜์ค€ => x3 (๋˜๋Š” <MenuItem> ์ด <li> ๋ณด๋‹ค ๊ฑฐ์˜ x10 ๋Š๋ฆฐ ์ด์œ ).
  • makeStyles๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ๋ชจ๋Š” ๋‹จ์ผ ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ๊ฐ์ • / sc๋Š” ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CSS ์„ ํƒ๊ธฐ๊ฐ€์žˆ๋Š” ๋‹จ์ผ ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์นด๋“œ ์ปจํ…Œ์ด๋„ˆ์˜ ํ•ญ๋ชฉ์„ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” ๋ฐ˜๋Œ€๋กœ ๊ธฐ๋ณธ makeStyles ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ํ•ญ๋ชฉ ๋‹น ํ•˜๋‚˜์”ฉ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ @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';

Capture dโ€™eฬcran 2020-09-23 aฬ€ 17 23 23
Capture dโ€™eฬcran 2020-09-23 aฬ€ 17 25 07
Capture dโ€™eฬcran 2020-09-23 aฬ€ 17 23 54

์ด ์‹œ์ ์—์„œ ์™œ ๋Š๋ฆฐ ์ง€ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ์Šคํƒ€์ผ์— ์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค โš ๏ธ!

Slider์˜ WIP ๊ฐ์ • ๋ฒ„์ „์˜ ์„ฑ๋Šฅ์„๋ณด๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ ์šฉ์œผ๋กœ ๋นŒ๋“œ๋˜๋ฉด ํ†ต๊ณ„๋Š” https://github.com/mui-org/material-ui/issues/22342#issuecomment -697540546๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ์•ฝ x1.6 ๋Š๋ฆฝ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ CSS๋Š” ์™„์ „ํžˆ ๋™์  ์ž„). WIP ๊ฐ์ • ๋ฒ„์ „์œผ๋กœ ํ”Œ๋ ˆ์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Capture dโ€™eฬcran 2020-09-23 aฬ€ 18 56 01

Capture dโ€™eฬcran 2020-09-23 aฬ€ 18 55 48

๋˜ํ•œ withStyles : # 15023 ๋Œ€์‹  makeStyles๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ JSS ๋ฒ„์ „ x1.1์„ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

prod ๋ชจ๋“œ์˜ @oliviertassinari ๋Š” ์กฐ๊ธˆ ๋” ๋นจ๋ผ์ง€์ง€๋งŒ ์ฐจ์ด์ ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ> ์ฝ”๋“œ ์ƒŒ๋“œ ๋ฐ•์Šค์˜ vercel์„ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ํ”Œ๋ž˜๊ทธ๋กœ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

makeStyles ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๋ฉด ์ •์  ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋น ๋ฅธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ๋งˆ์šดํŠธ์—์„œ attach ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  2. ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ ์œ ํ˜•์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค ์ธ ๊ฒฝ์šฐ stylesCreator.create ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  makeStyles(fn) ์ง€์ •๋œ fn ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค๋ฅธ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ๋Š” ์ฐธ์กฐ ์ˆ˜๊ฐ€> 0์ด๋ฏ€๋กœ stylesCreator.create ๋ฅผ ๊ฑด๋„ˆ ๋œ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒฝ์šฐ :

  1. ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•  ๋•Œ๋งˆ๋‹ค attach ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  2. ์ดํ›„, ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€> 0์ด๋ฏ€๋กœ stylesCreator.create ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๋ฏ€๋กœ ์ž‘์—…์ด ์ „ํ˜€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์  ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์‹œํŠธ๋Š” ๋ชจ๋“  ๋งˆ์šดํŠธ ๋ฐ ๋‹ค์‹œ ๋ Œ๋”๋ง์—์„œ ์—ฌ๊ธฐ ์—์„œ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ styled-components ๋ฐ emotion ๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค์—์„œ ์Šคํƒ€์ผ๋ง ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋” ๋งŽ์€ CPU์ฃผ๊ธฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์—ญ์••์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋“  ์†Œํ’ˆ ์กฐํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์ค‘ ๋ฉ”๋ชจ ์บ์‹œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์Šคํƒ€์ผ๋ง ๊ธฐ๋Šฅ์ด ์ˆœ์ˆ˜ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

     const someContext = useContext(FooContext);

    return <div css={ { paddingTop: someContext.padding(1) } }>;

๋‚ด ๊ฐ€์ •์ด ์˜ณ๋‹ค๋ฉด, ์ž‘๋™ ๋ฐฉ์‹๊ณผ API ์„ค๊ณ„ ๋ฐฉ์‹์ด styled ๋˜๋Š” makeStyles ์˜ ์„ฑ๋Šฅ ์ˆ˜์ค€์— ๋„๋‹ฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. css API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํƒ์ƒ‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉํ–ฅ์„ ๋ด…๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐ ํ˜ธ์˜ ์„ค๋ช…์—์„œ๋Š” Material-UI์˜ ๋™์  ์ง€์›์œผ๋กœ ์„ฑ๋Šฅ์„ ๋ฒค์น˜๋งˆํ‚นํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •์  ์ผ€์ด์Šค (v4๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ react-jss ์ •์  ๋ฐ ๋™์  ์‚ฌ๋ก€๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šคํƒ€์ผ ์—”์ง„ ์˜ต์…˜์˜ ๋ฒ”์œ„๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.
  • ๋ณ‘๋ชฉ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์กฐ์‚ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ jss ์šฉ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ฑ๋Šฅ์ด ๋” ์ข‹์€์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JSS์˜ ๋™์  ๋ฒ„์ „์—์„œ๋Š” ํ›จ์”ฌ ๋” ๋‚˜ ๋น ์ ธ์•ผํ•˜์ง€๋งŒ ์ •์  ๋ฒ„์ „๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ถ”์ƒํ™”์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์†๋„ ์ €ํ•˜๋ฅผ ๋™์  ์Šคํƒ€์ผ๊ณผ ์Šคํƒ€์ผ์ด์—†๋Š” ์Šคํƒ€์ผ์„ ์ž ๊ธˆ ํ•ด์ œํ•˜๋Š” ๋ฐ ์ง€์ถœ ํ•  ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๊ฐ€๊ฒฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธด ๋ชฉ๋ก์„ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด ๊ฐ€์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ค‘์ฒฉ ๋œ CSS ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐ์ • ๋ฐ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ์—…๊ณ„์—์„œ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅธ ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋˜์—ˆ์œผ๋ฉฐ React๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋“  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๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ฃผ์š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋จธํ‹ฐ๋ฆฌ์–ผ์ด ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์‹ค์งˆ์ ์œผ๋กœ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š”์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ด์‹ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.
  • Material UI ์™ธ๋ถ€์—์„œ ์ด๋ฏธ withStyles ๋ฐ makeStyles ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ฌด๋ฃŒ๋กœ ๋™์  CSS์— ๋Œ€ํ•œ ํ–ฅ์ƒ๋œ ์„ฑ๋Šฅ์˜ ์ด์ ์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • classes + CSS API๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์ถ”๊ฐ€ ๋กœ์ง์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. styled ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์—ญ className ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” util๋กœ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์ „๋žต์—์„œ useCss ๋Š” styled ๋Œ€์‹  JS ์†”๋ฃจ์…˜์˜ CSS ์šฉ ์–ด๋Œ‘ํ„ฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • JS ์†”๋ฃจ์…˜์—์„œ ๋‹ค๋ฅธ CSS๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด useCss ํ›„ํฌ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” styled ์ฒ˜๋Ÿผ webpack / babel ์•จ๋ฆฌ์–ด์‹ฑ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” 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โ€ฆ

ํ† ๋ก  ๋Šฆ๊ฒŒ ์—ฌ๊ธฐ์—์„œ ๊ท€์ฐฎ๊ฒŒํ•ด์„œ ๋ฏธ์•ˆํ•˜์ง€๋งŒ styled-jsx๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด ๋ณด์ง€ ์•Š์•„์„œ ์กฐ๊ธˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์˜ ๋ชฉ๋ก์€ ๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ์ถฉ์กฑํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Works ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ
  • ์™„์ „ํ•œ CSS ์ง€์›, ํž˜์˜ ๊ท ํ˜• ์—†์Œ
  • 3kb์˜ ๋Ÿฐํƒ€์ž„ ํฌ๊ธฐ (12kb์—์„œ gzip์œผ๋กœ ์••์ถ• ๋จ)
  • ์™„๋ฒฝํ•œ ๊ฒฉ๋ฆฌ : ์„ ํƒ๊ธฐ, ์• ๋‹ˆ๋ฉ”์ด์…˜, ํ‚ค ํ”„๋ ˆ์ž„
  • ๋‚ด์žฅ CSS ๊ณต๊ธ‰ ์—…์ฒด ์ ‘๋‘์‚ฌ
  • ๋งค์šฐ ๋น ๋ฅด๊ณ  ์ตœ์†Œํ•œ์˜ ํšจ์œจ์ ์ธ ํŠธ๋žœ์Šค ํŒŒ์ผ (์•„๋ž˜ ์ฐธ์กฐ)
  • ์„œ๋ฒ„ ๋ Œ๋”๋ง์ด ์•„๋‹ ๋•Œ ๊ณ ์„ฑ๋Šฅ ๋Ÿฐํƒ€์ž„ -CSS ์ฃผ์ž…
  • ๋ฏธ๋ž˜ ๋ณด์žฅ : ์„œ๋ฒ„ ๋ Œ๋”๋ง ๊ฐ€๋Šฅ "Shadow CSS"์™€ ๋™์ผ
  • ์†Œ์Šค ๋งต ์ง€์›
  • ๋™์  ์Šคํƒ€์ผ ๋ฐ ํ…Œ๋งˆ ์ง€์›
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•œ CSS ์ „์ฒ˜๋ฆฌ

๊ฑฐ์˜ ๊ทธ๋ฆผ์ž 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์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ž์‹ ์‚ฌ์ด์— ๋ˆ„์ถœ๋˜๋Š” ์ „์—ญ CSS ์„ ํƒ์ž์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„ : ์˜ˆ : In .css-e7ylz8 .MuiTreeItem-group . ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค (์˜ˆ์ƒํ–ˆ๋˜ ํšจ๊ณผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋†€๋ž์Šต๋‹ˆ๋‹ค!). ์šฐ๋ฆฌ๊ฐ€ ์กฐ์‹ฌํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์•„๋งˆ๋„ ์šฐ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
  2. ์ฒ˜๋ฆฌ ํฌํ„ธ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://material-ui.com/guides/interoperability/#portals. ํˆดํŒ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋ ค๋ฉด Slider์—์„œํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ popper ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  3. $styleRule ๊ตฌ๋ฌธ์€ ์Šคํƒ€์ผ ๊ทœ์น™์ด ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉ์ž ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ•ด๊ฒฐ์ฑ…์€ 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 ํŒŒ์ผ
  • SCSS
  • JSS

ํ•ด๋‹น ํŒ€์˜ ํ•„์š”์™€ ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ

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๊ฐ€ ํ˜ผํ•ฉ ๋œ ๊ฒฝ์šฐ๋งŒํผ ์œ ๋งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋ฟ ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ต์ฐจ ํ”Œ๋žซํผ MUI๊ฐ€ ์‹ค์ œ๋กœ RN์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด react-dom ์‚ฌ์šฉ์˜ ๊ทนํžˆ ์ผ๋ถ€์— ๋ถˆ๊ณผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์›น์€ ๊ฑฐ๋Œ€ํ•˜๊ณ  react-dom ์ด ํ˜„๋Œ€ ์›น ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์ง€๋ฐฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์‚ฌ์šฉ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์  ๋”๋ผ๋„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ ˆ๋Œ€์ ์ธ ์‚ฌ๋žŒ์œผ๋กœ์„œ ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ MUI ์‚ฌ์šฉ์ž์˜ ์„ค๋ฌธ ์กฐ์‚ฌ๊ฐ€ npm ํ†ต๊ณ„๋ณด๋‹ค ๋” ๋‚˜์€ ์ธก์ • ํ•ญ๋ชฉ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ฃจํ”„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, React Native๋ฅผ ์ธ์ˆ˜ํ•˜๋Š” Flutter๋ฅผ ๊ตฌ๋งคํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ํŠธ๋ž˜ํ”ฝ ๋น„๊ต๋Š” ์‹ค์ œ๋กœ ๋น„๊ตํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ํ˜ผ๋ž€ ์š”์ธ์— ์˜ํ•ด ์˜ํ–ฅ์„๋ฐ›์Šต๋‹ˆ๋‹ค (Flutter๋Š” ๋” ์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ RN์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์—‘์Šคํฌ์—). ์ด ๋‹ค์†Œ ๊ฒฐํ•จ์ด์žˆ๋Š” Google ํŠธ๋ Œ๋“œ ๋น„๊ต ๋Š” ๊ฑฐ์˜ ๋” ๋‚˜์€ ์ฒ™๋„์ด๋ฉฐ ์ƒ๋‹นํžˆ ๊ท ์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ Flutter์— ๋ช‡ ๊ฐ€์ง€ ์–ด๋ ค์šด ๊ฑฐ๋ž˜๊ฐ€ ์žˆ์—ˆ์œผ๋ฉฐ RN์€ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋ฐ”์ผ ์•ฑ์„ ์›ํ•œ๋‹ค๊ณ  ๋งํ•  ๋•Œ ์—ฌ์ „ํžˆ ํ›จ์”ฌ ๋” ์œ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • JSS๋Š” (์‹ค์ œ๋กœ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ํฐ) ๊ธฐ๋ณธ ๋ฐ˜์‘๊ณผ MUI ์ž‘์—…์„ ๋งŒ๋“ค๊ธฐ์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์˜€๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ช‡ ๊ฐ€์ง€ ๋ณต์žกํ•œ ์š”์†Œ๊ฐ€์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, IMHO๋Š” ๊ฐ์ •์œผ๋กœ์˜ ์ „ํ™˜์„ ํ†ตํ•ด ์ตœ์†Œํ•œ ์‹คํ—˜์ ์œผ๋กœ RN์—์„œ MUI๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ์–ด๋ ค์›€์˜ 2/3๋ฅผ ์ œ๊ฑฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์ •์œผ๋กœ์˜ ์ „ํ™˜์€ RN์—์„œ MUI๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ์–ด๋ ค์›€์˜ 2/3๋ฅผ ์ œ๊ฑฐํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์˜ POC๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์˜ POC๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

๊ธฐํšŒ๊ฐ€๋œ๋‹ค๋ฉด ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์‹ถ์–ด์š”. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฌด๊ด€์‹ฌํ•œ ๊ฒƒ์— ๋Œ€ํ•ด POC๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ถ„์œ„๊ธฐ๊ฐ€ ์•„๋งˆ๋„ ๋ฒ„๋ ค ์งˆ ๊ฒƒ์ด๋ผ๋Š” ์ ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ง“๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ RN์˜ ๊ฐ€์น˜ ๋˜๋Š” RN์˜ ๊ฐ€์น˜๋ฅผ ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ๋ฌด์‹œํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ :

  1. HOC์—†์ด ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” MUI๊ฐ€ ํ˜„์žฌ ๊ฐ€์ง€๊ณ ์žˆ๋Š” React hook API๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
  2. 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 ๐Ÿ˜„์— ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰