React: ์Šคํƒ€์ผ์„ ์–ด๋–ป๊ฒŒ ์บก์Šํ™”ํ•ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2015๋…„ 03์›” 05์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

์•ˆ๋…•ํ•˜์„ธ์š”,
Polymer๋กœ ์ž‘์„ฑ๋œ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ React๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ง๋ฉด ํ•œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์บก์Šํ™” ๋œ ์Šคํƒ€์ผ๋ง์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚ด ๊ตฌ์„ฑ ์š”์†Œ ์‚ฌ์ด์— ์บก์Šํ™” ๋œ ์Šคํƒ€์ผ๋กœ sass ํŒŒ์ผ์„ ์บก์Šํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ „์ฒด ๋ฐ˜์‘ ์›น ์‚ฌ์ดํŠธ์™€ ๋ฌธ์„œ์—๋Š” ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ React ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ chrome devtools์—๋Š” ์Šคํƒ€์ผ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (์ผ๋ฐ˜ DOM์˜ devtools์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค).
์ €๋Š” React๊ฐ€ ์ •๋ง ๋งˆ์Œ์— ๋“ค์–ด์š”.์ด ๋ฌธ์ œ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผ ํ•  ๊ฑด๊ฐ€์š”?

Question

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

์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ์ด ๋ฌธ์„œ๋ฅผ ๋ณธ ์ ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. http://facebook.github.io/react/tips/inline-styles.html

์šฐ๋ฆฌ์˜ ์Šคํƒ€์ผ์€ ๋ธŒ๋ผ์šฐ์ € ์Šคํƒ€์ผ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ์บก์Šํ™”๋ฅผ์œ„ํ•œ Shadow DOM๋งŒํผ ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์€ ์•„์ง ์—†์ง€๋งŒ ์›น์€ Shadow DOM์—†์ด ์ˆ˜๋…„ ๋™์•ˆ ์กด์žฌ ํ•ด ์™”์œผ๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋””์ž์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์Šคํƒ€์ผ ์žฌ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ์Šคํƒ€์ผ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ • ํ•œ ๋‹ค์Œ ๋” ๊ตฌ์ฒด์ ์ธ ์„ ํƒ๊ธฐ๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๊ธฐ๋ณธ ์Šคํƒ€์ผ์ด ๋ชจ๋‘ ํฌํ•จ ๋œ ๊ธฐ๋ณธ ์ธ๋ผ์ธ ์Šคํƒ€์ผ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๋ชจ๋“  ์œ„์น˜์— ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฉฐ ํŠน์ • ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  Object.assign ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•˜๋ ค๋Š” ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด 2 ์„ผํŠธ์ž…๋‹ˆ๋‹ค. cc @spicyj

์ถ”์‹  : ์ด๊ฒƒ์€ React์˜ ๋ฒ„๊ทธ ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ๋ฒ• ์งˆ๋ฌธ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์†ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ฌธ์ œ๋ฅผ ์ข…๊ฒฐํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ๊ฐœ๋ฐœ ๋ชฉ์ ์„ ์œ„ํ•ด ๋ ˆ์ด๋”์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค). ์ด์™€ ๊ฐ™์€ ์งˆ๋ฌธ์— ์ด์ƒ์ ์ธ ์žฅ์†Œ๋Š” StackOverflow์ž…๋‹ˆ๋‹ค.

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

์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ์ด ๋ฌธ์„œ๋ฅผ ๋ณธ ์ ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. http://facebook.github.io/react/tips/inline-styles.html

์šฐ๋ฆฌ์˜ ์Šคํƒ€์ผ์€ ๋ธŒ๋ผ์šฐ์ € ์Šคํƒ€์ผ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ ์บก์Šํ™”๋ฅผ์œ„ํ•œ Shadow DOM๋งŒํผ ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์€ ์•„์ง ์—†์ง€๋งŒ ์›น์€ Shadow DOM์—†์ด ์ˆ˜๋…„ ๋™์•ˆ ์กด์žฌ ํ•ด ์™”์œผ๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋””์ž์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์Šคํƒ€์ผ ์žฌ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ์Šคํƒ€์ผ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ • ํ•œ ๋‹ค์Œ ๋” ๊ตฌ์ฒด์ ์ธ ์„ ํƒ๊ธฐ๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๊ธฐ๋ณธ ์Šคํƒ€์ผ์ด ๋ชจ๋‘ ํฌํ•จ ๋œ ๊ธฐ๋ณธ ์ธ๋ผ์ธ ์Šคํƒ€์ผ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๋ชจ๋“  ์œ„์น˜์— ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฉฐ ํŠน์ • ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  Object.assign ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•˜๋ ค๋Š” ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด 2 ์„ผํŠธ์ž…๋‹ˆ๋‹ค. cc @spicyj

์ถ”์‹  : ์ด๊ฒƒ์€ React์˜ ๋ฒ„๊ทธ ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ๋ฒ• ์งˆ๋ฌธ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์†ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ฌธ์ œ๋ฅผ ์ข…๊ฒฐํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ๊ฐœ๋ฐœ ๋ชฉ์ ์„ ์œ„ํ•ด ๋ ˆ์ด๋”์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค). ์ด์™€ ๊ฐ™์€ ์งˆ๋ฌธ์— ์ด์ƒ์ ์ธ ์žฅ์†Œ๋Š” StackOverflow์ž…๋‹ˆ๋‹ค.

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

var MyComponent = React.createClass({
  render: function() {
    return (
      <div className="MyComponent">
        <button className="MyComponent__button">Hi!</button>
      </div>
    );
  }
});

๊ทธ๋Ÿฐ ๋‹ค์Œ CSS์—์„œ ๋‹จ์ผ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์„ ํ˜ธํ•˜๋Š” ํ•˜์œ„ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๋Š” ์Šคํƒ€์ผ ๋ถ„๋ฆฌ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ ๋ถ„๋ฆฌ๋ฅผ ์ด‰์ง„ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ ๋„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜ํŠธ๋Š” ํ›Œ๋ฅญํ•œ ๋…ธ์ฆˆ ํˆด๋ง (์žฌ ์ž‘์—…)๊ณผ ์ ํ•ฉ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€์žˆ์–ด ์Šคํƒ€์ผ์ด ๋ฒˆ์ง€์ง€ ์•Š๋„๋ก ์ž๋™ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜ ๋‹ค๋ฅธ ํ›Œ๋ฅญํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค : https://github.com/Wildhoney/ReactShadow

๋˜ ๋‹ค๋ฅธ ์ž ์žฌ์  ์†”๋ฃจ์…˜์€ http://projects.formidablelabs.com/radium/์ž…๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•˜๊ณ  ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋ฉด @spicyj๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” BEM๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋‚ด ๊ฒฝํ—˜์—์„œ React์™€ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” SuitCSS๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

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